C言語学習ポータル(無料版) 学習コンテンツ 変数・型・演算子 浮動小数点数 float / double

📦 変数・型・演算子

浮動小数点数 float / double

無料公開版に収録・読む目安 12分

🎯 doubleを既定として使い分け、小数に必ず誤差があることと比較の作法を理解する

平均点、身長、円周率。世の中の数値の多くは整数では表せません。小数を扱う型がdoubleです。

まずは double を使う

#include <stdio.h>

int main(void) {
    double shinchou = 1.725;   // メートル
    double taijuu   = 61.25;   // キログラム
    double bmi = taijuu / (shinchou * shinchou);

    printf("BMIは %.1f です\n", bmi);
    return 0;
}

コードに小数を書くと、その値は既定で double として扱われます。表示は %f(既定で小数点以下6桁)、%.1f のように桁数を指定できます。

float と double の違い

・float … 4バイト。有効桁はおよそ7桁。1.5f のように末尾に f を付ける。
・double … 8バイト。有効桁はおよそ15〜16桁。迷ったらこちら。

double は「倍精度」という意味です。メモリが厳しい組込みや、膨大な数値を並べる場面を除けば、double が標準の選択になります。

動く例——誤差を目で見る

#include <stdio.h>

int main(void) {
    double a = 0.1 + 0.2;

    printf("%.1f\n", a);
    printf("%.17f\n", a);
    printf("%d\n", a == 0.3);
    return 0;
}

出力は 0.3、0.30000000000000004、0 です。0.1 も 0.2 も、2進数では割り切れない循環小数になります。10進数で 1/3 が 0.333… と書き切れないのと同じ理由で、ごく小さな誤差が必ず残ります。バグではなく、仕組み上そうなります。

だから小数は == で比べない

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

int main(void) {
    double a = 0.1 + 0.2;

    if (fabs(a - 0.3) < 1e-9) {
        printf("ほぼ等しい\n");
    }
    return 0;
}

「差の絶対値が十分小さければ等しいとみなす」——これが小数の比較の定石です。fabs は math.h の絶対値関数、1e-9 は 0.000000001 という書き方です。

罠・注意

printf は %f、scanf は %lf。 double を読むときだけ l が付きます。非対称なので間違えやすいところです。

お金の計算に double は向かない。 誤差が積み上がると1円ずれます。金額は最小単位(銭・円)の整数で持つのが定石です。

表示は丸められている。 %.1f で 0.3 と見えても、中身は 0.30000000000000004 のまま。見た目と中身を混同しないことです。

師範小数の等号は、砂粒の数を目で比べるようなものじゃ。「同じか」ではなく「近いか」を問え。

まとめ

小数は double を既定に。float は精度がおよそ半分で、末尾に f が要ります。2進数で表せない値には必ず誤差が乗るため、== ではなく差の大きさで比較します。printf は %f、scanf は %lf。

要点まとめ

アプリで演習問題まで解く(無料・登録不要)

この項目に出てくる用語

double型だぶるがた

小数を含む数値を扱うための型のこと。floatより広い範囲と高い精度を持ち、実数計算における標準的な選択肢として使われる。小数点以下の桁数が多い計算でも、比較的高い精度を保てるのが特徴。

書式指定子しょしきしていし

printfやscanfで使う%dや%fのような記号のこと。続けて渡す値をどんな型・どんな見た目として扱うかを指定する役割を持つ。指定する型と実際に渡す値の型がずれると、思わぬ表示結果になることがある。

scanfすきゃんえふ

キーボードからの入力を読み取り、変数に格納する標準ライブラリの関数のこと。変数の前に&を付け忘れるミスが定番の罠として知られる。戻り値として、正しく読み取れた個数が返ってくる点も覚えておくとよい。

同じトラックのほかの項目

変数とは名前付きの箱宣言・代入・初期化を区別し、型のついた変数を正しく作って使える int型と整数の世界intの範囲と限界値の調べ方を知り、long long・unsignedの使いどころが分かる char型と文字コードcharが1バイトの小さな整数であることを理解し、文字と数値を相互に変換できる bool型と真偽——C23標準の書き方C23のbool/true/falseをそのまま使い、Cにおける真偽(0が偽・0以外が真)を説明できる 定数——const と constexprconstとconstexpr(C23)を使い分け、変わらない値を宣言時に固定できる 算術演算子と優先順位5つの算術演算子と優先順位を理解し、複合代入・インクリメントを正しく使える 整数の割り算と剰余の罠整数どうしの割り算が切り捨てになる理由を理解し、平均計算などで正しく対処できる 型変換——暗黙と明示暗黙の型変換が起きる方向を知り、キャストで意図を明示できる 2進数・16進数リテラル(0b / 0x / 桁区切り')0b・0x・8進の書き方の違いを理解し、C23の桁区切りで読みやすく数値を書ける sizeofとメモリ上のサイズsizeofで型と変数のバイト数を測り、型ごとに箱の大きさが違うことを実感できる オーバーフローという事件オーバーフローが起きる仕組みと危険性を理解し、桁の見積もりと予防策を実行できる
‹ int型と整数の世界 char型と文字コード ›

もっと先へ:ポインタ・メモリ・ファイル入出力・セキュアコーディングを含む全26トラックと、段位検定・模試のフルセットは完全版に収録しています。

完全版(BOOTH)を見る

📚 姉妹教材:手を動かして覚える Linux 教材 — Linuxとインフラの仕組みを地図で学ぶ

Web版 / BOOTH