C言語基礎|浮動小数点定数

小数の書き方ひとつで、型も精度も変わる。浮動小数点定数を“正しく書ける”ようになろう!

3.14 はただの数字じゃなくて「型つきの定数」

C言語で 3.14 や 57.3 のように小数をそのまま書くと、それは 浮動小数点定数(floating-point constant)になります。

ここで大事なのは、浮動小数点定数には

  • 見た目(書き方)
  • 指数(Eやeの部分)
  • 接尾語(F や L)

といった要素があり、それによって 型(float / double / long double)が決まることです。

つまり、同じ 57.3 でも
57.3 / 57.3F / 57.3L は “別物” として扱われるんですね。

浮動小数点定数の構造

ご提示の「構文図(文章化)」を、実務で使える形に整理します。

浮動小数点定数を構成する部品

部品意味
整数部57小数点より左
小数点.小数点
小数部3小数点より右
指数部E4 / e-510のべき乗でスケールする
浮動小数点接尾語F / L型を指定する

表の説明
浮動小数点定数は「整数部+小数点+小数部」に、必要なら「指数部」や「接尾語」が付くイメージです。
指数部は “×10n” の形を短く書くために使います。

型は接尾語で決まる(付けないと double)

接尾語と型の対応

書き方
接尾語なしdouble57.3
F または ffloat57.3F
L または llong double57.3L

表の説明

  • 何も付けないと double になります(これがデフォルト)。
  • float にしたいときは F、long double にしたいときは L
  • 小文字の l は 1 と見分けがつきにくいので、L 推奨です。

指数表記(E / e)は「10のべき乗」

指数部が付くと、数学の 1.23 × 10^4 の形をそのまま書けます。

指数表記の意味

1.23E4   = 1.23 × 104
89.3E-5  = 89.3 × 10-5

図の説明
E の後ろは「10の何乗か」です。マイナスなら小さくなります。

省略できる部分・できない部分

浮動小数点定数は、整数部や小数部を省略できることがあります。

省略パターンの例

書き方意味
.50.5double
12.12.0double
.5F0.5float
1L1.0long double

表の説明

  • .5 は「整数部が省略された」例(0.5)。
    12. は「小数部が省略された」例(12.0)。
  • 接尾語を付けると型も変わります。
  • ただし「全部省略」はできません。小数点と小数部まで消すなら、整数部は必須になります(例:1L)。

サンプル:定数の“型”と“値”をまとめて確認

浮動小数点定数の書き方(接尾語・指数・省略)で型と値がどう見えるかを確認するプログラムです。

プロジェクト名:chap7-25-1 ソースファイル名:chap7-25-1.c

// 浮動小数点定数の書き方と型を確認する
#include <stdio.h>

int main(void)
{
    double a = 57.3;     // 接尾語なし → double
    float  b = 57.3F;    // F → float
    long double c = 57.3L; // L → long double

    double d = 1.23E4;   // 指数表記
    double e = .5;       // 整数部省略
    double f = 12.;      // 小数部省略

    printf("浮動小数点定数は、書き方で型が変わります。\n");

    printf("\n【接尾語で型を指定】\n");
    printf("57.3   は double です -> %.10f\n", a);
    printf("57.3F  は float  です -> %.10f\n", b);
    printf("57.3L  は long double です -> %.10Lf\n", c);

    printf("\n【指数表記と省略表記】\n");
    printf("1.23E4 は 12300.0 の意味 -> %.10f\n", d);
    printf(".5     は 0.5 の意味     -> %.10f\n", e);
    printf("12.    は 12.0 の意味    -> %.10f\n", f);

    return 0;
}

このプログラムで分かること

  • 浮動小数点定数は 接尾語がなければ double
  • F を付けると float、L を付けると long double
  • E / e の指数表記は 10のべき乗
  • .5 や 12. のように一部省略もできる。

登場する命令の書式と役割

printf 関数

書式

  • printf(書式文字列, 引数1, 引数2, ...);

何をする命令?
画面に文字列や数値を表示します。

今回よく出る変換指定子

指定子対象説明
%fdouble(floatは渡すとdoubleに拡張される)小数表示
%Lflong doublelong double を小数表示
%.10fdouble小数点以下を10桁で表示
%.10Lflong double小数点以下を10桁で表示

表の説明

  • Cの可変長引数(printf)では、float は自動的に double に拡張されて渡されます。
    だから float を表示する場合も、基本は %f でOKです。
  • long double だけは別扱いなので、%Lf を使います。

<math.h> と sqrt 関数(文書内の項目としてしっかり整理)

本文には <math.h> と sqrt も登場するので、ここも丁寧に押さえます。

sqrt 関数

ヘッダ

  • #include <math.h>

形式

  • double sqrt(double x);

何をする命令?
x の平方根(√x)を計算して返します。

返却値

  • 計算した平方根を返します。

sqrt / sqrtf / sqrtl の使い分け

関数引数の型戻り値の型使う場面
sqrtdoubledouble基本はこれ
sqrtffloatfloatfloat で統一したいとき
sqrtllong doublelong doublelong double を活かしたいとき

表の説明
型に合わせた関数を選ぶと、余計な変換が減って意図が明確になります。
ただし「基本は double」で進めるのが一番ラクです。

演習問題

ここでは「類似」になるように、入力・sizeof・sqrt をそれぞれ扱う構成にします。

演習7-7:3種類の型で読み込んで表示

float / double / long double の3つの変数に数値を読み込み、それぞれを表示するプログラムを作成せよ。表示は小数点以下を多めに出して違いを観察せよ。

解答例

プロジェクト名:chap7-25-2 ソースファイル名:chap7-25-2.c

#include <stdio.h>

int main(void)
{
    float a;
    double b;
    long double c;

    printf("float 用の数値を入力してください: ");
    scanf("%f", &a);

    printf("double 用の数値を入力してください: ");
    scanf("%lf", &b);

    printf("long double 用の数値を入力してください: ");
    scanf("%Lf", &c);

    printf("\n入力値の確認です。\n");
    printf("float       = %.10f\n", a);
    printf("double      = %.17f\n", b);
    printf("long double = %.21Lf\n", c);

    return 0;
}

解説(ここがポイント)

  • scanf の指定子は型で違います
    ・float は %f
    ・double は %lf
    ・long double は %Lf
  • 表示は float/double/long double で桁数を変えると「精度差」が見えやすいです

演習7-8:sizeof で型の大きさを表示

float / double / long double の大きさを sizeof で求めて表示せよ。

解答例

プロジェクト名:chap7-25-3 ソースファイル名:chap7-25-3.c

#include <stdio.h>

int main(void)
{
    printf("float       の大きさ = %zu バイト\n", sizeof(float));
    printf("double      の大きさ = %zu バイト\n", sizeof(double));
    printf("long double の大きさ = %zu バイト\n", sizeof(long double));

    return 0;
}

解説

  • sizeof(型名) は「その型が何バイトか」を返します
  • 結果は環境依存です(処理系によって long double が 16 の場合もあります)

演習7-9:面積から一辺を求める(sqrt使用)

実数値の面積を読み込み、その面積を持つ正方形の一辺の長さを求めて表示せよ。

解答例

プロジェクト名:chap7-25-4 ソースファイル名:chap7-25-4.c

#include <math.h>
#include <stdio.h>

int main(void)
{
    double area;

    printf("正方形の面積を入力してください: ");
    scanf("%lf", &area);

    if (area < 0.0) {
        printf("面積は0以上で入力してください。\n");
        return 0;
    }

    double side = sqrt(area);
    printf("一辺の長さは %f です。\n", side);

    return 0;
}

解説

  • side = sqrt(area) で、一辺を計算できます(side × side = area)
  • 負の面積は現実的におかしいので、簡単に入力チェックしておくと安心です。