C言語学習ポータル(無料版) 学習コンテンツ つまずきとエラー 浮動小数点数を == で比較する

📦 変数・型・演算子

浮動小数点数を == で比較する

どんなときに起きるか

if (0.1 + 0.2 == 0.3) が成立しません。printf("%.17f\n", 0.1 + 0.2) すると 0.30000000000000004。-Wfloat-equal を付けると warning: comparing floating-point with '==' or '!=' is unsafe。

なぜそうなるのか

0.1 や 0.2 は2進小数では正確に表せず、ごく小さな誤差を含みます。誤差を含んだ計算結果が、別の書き方で得た値とビット単位まで一致するとは限りません。

直し方・再発防止

差の絶対値で比べます: if (fabs(a - b) < 1e-9)(math.h、リンクは -lm)。扱う値の桁が広いときは相対誤差で比べます。金額のように厳密さが必要なものは、そもそも整数(円単位)で持つのが最も確実です。

0.1にも事情がある(4コマ漫画)
4コマで見る「0.1にも事情がある」

アプリでしっかり学ぶ(無料・登録不要) つまずき一覧へ

同じ場面で起きやすいつまずき

整数どうしの割り算が切り捨てられるint a = 7, b = 2; double r = a / b; の結果が 3.5 ではなく 3.0 にな… 変数を初期化せずに使う実行するたびに結果が変わります。自分のPCでは0で正しく動くのに、別の環境や最適化を変えた途端に壊れます。gcc… キャスト忘れの整数演算(計算の途中であふれる)long long total = 100000 * 100000; の結果が 1410065408 になります… 演算子の優先順位の誤解if (x & 1 == 0) が思った通りに動きません。gcc: warning: suggest paren…

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

完全版(BOOTH)を見る

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

Web版 / BOOTH