浮動小数点と整数の演算は全く異なるパラダイムに従う

Float and integer arithmetic follow two different paradigms

浮動小数点と整数の演算は全く異なるパラダイムに従う

整数演算では、Cコンパイラが未定義動作を前提に最適化するため、開発者は事前にオーバーフローを予測し、checked_addや__builtin_mul_overflowなどで対処する必要がある。一方、IEEE-754浮動小数点では、エラーはNaNや無限大として伝播し、プログラムをクラッシュさせない。それにもかかわらず、多くの開発者がゼロ除算チェックやFLT_EPSILONによる比較を行い、かえって有害なコードを生んでいる。著者は、計算結果が有限かどうかをisfiniteで確認するだけで十分だと主張する。

浮動小数点には多くの欠点があるが、今回ばかりは、これは私の個人的な意見だが、整数演算よりもはるかに便利で安全に扱えると思う。
  1. weinzierl

    「整数演算のパラダイム」とは、(ほぼ)すべての演算の後にチェックするか、あるいは潜在的に誤った結果を受け入れるかのどちらかを意味することになるだろう。

    前者はひどく非効率で、後者は単に間違っている(どれほど驚くほど一般的であっても)。

    悲しいことに、整数がOPの言う「浮動小数点パラダイム」に従えない理由など何もないのだ。遅くする必要すらない。ほとんどの現代のプロセッサ(x86を無視すれば)は、何らかの形のスティッキー演算フラグをサポートしている。残念ながら、プログラミング言語がそれらをサポートしていないので、使われていない。

    ゼロ除算が受ける特別扱いについても、言うべきことはある。

  2. a_e_k

    浮動小数点関連では、`-ffinite-math-only` に注意が必要だ。これが有効になっていると、`isfinite()` は真と仮定されてコンパイルで消えてしまう可能性がある(`isnan()` や `isinf()` についても同様の仮定がなされる)。

    そして `-ffinite-math-only` は `-ffast-math` によって有効になり、`-ffast-math` は `-Ofast` によって有効になる。

  3. dooglius

    参考までに、浮動小数点例外は実行時にオーバーヘッドなしで設定できる。`man 3 fenv` を参照のこと。

この日のほかの記事

2026-10-08