【あいとりぷるいー ななごよん】

IEEE 754 とは?

💡 コンピュータが小数を扱うための「世界共通のルールブック」
📌 このページのポイント
IEEE 754 浮動小数点数の構造 単精度(32ビット / float) 符号 1bit 指数部(Exponent) 8bit 仮数部(Mantissa / Fraction) 23bit 倍精度(64ビット / double) 符号 1bit 指数部 11bit 仮数部(Mantissa / Fraction) 52bit 特殊値 指数=全1, 仮数=0 ± Infinity 指数=全1, 仮数≠0 NaN 指数=全0, 仮数=0 ± 0
IEEE 754 単精度・倍精度のビットレイアウトと特殊値
ひよこ ひよこ

IEEE 754ってよく聞くけど、何を決めてる規格なの?

ペンギン先生 ペンギン先生

コンピュータが小数を扱うときの「表現方法」を統一した規格だよ。昔はメーカーごとに小数の扱い方がバラバラで、同じ計算でも結果が違うことがあったんだ。IEEE 754のおかげで、どのCPUでも同じ方式で小数を表せるようになったよ。

ひよこ ひよこ

具体的にはどうやって小数を表してるの?

ペンギン先生 ペンギン先生

数値を「符号」「指数部」「仮数部」の3つに分解するんだ。例えば64ビットの倍精度なら、符号1ビット・指数11ビット・仮数52ビットで合計64ビット。科学的記数法の「±1.xxx × 2^n」をビットで表現していると思えばいいよ。

ひよこ ひよこ

0.1 + 0.2 が 0.3 にならないのもこの規格のせいなの?

ペンギン先生 ペンギン先生

正確には「せい」というより「仕組み上の限界」だね。0.1 は二進数では無限小数になるから、有限ビットに丸める必要がある。その丸め誤差が積み重なって 0.30000000000000004 のような結果になるんだ。これはIEEE 754の設計上、避けられないことだよ。

ひよこ ひよこ

NaN とか Infinity も IEEE 754 で決まってるの?

ペンギン先生 ペンギン先生

そうだよ。指数部が全ビット1のとき、仮数部が0なら無限大(Infinity)、0でなければNaN(Not a Number)と定義されている。0÷0の結果はNaN、1÷0の結果はInfinityになるのも、この規格で決まったルールなんだ。

ひよこ ひよこ

お金の計算みたいに正確さが必要なときはどうするの?

ペンギン先生 ペンギン先生

金融計算では浮動小数点数を使わず、整数で「何円」「何セント」と扱うか、Decimal型(固定小数点)を使うのが鉄則だよ。JavaのBigDecimal、PythonのDecimalモジュールなどがその例だね。

ひよこ ひよこ

プログラマーとしてはどこまで意識しておけばいいの?

ペンギン先生 ペンギン先生

浮動小数点数の比較は == ではなく誤差許容範囲(イプシロン)で判定する」「お金の計算にはfloat/doubleを使わない」この2つを覚えておけば実務では十分だよ。あと、denormalized number(非正規化数)の存在も知っておくと、極小値付近の計算で精度が落ちる理由が分かるようになるよ。

ペンギン
まとめ:ざっくりこれだけ覚えればOK!
「IEEE 754」って出てきたら「コンピュータが小数を表す世界標準のルール」と思えればだいたいOK!
📖 おまけ:英語の意味
「IEEE 754 Standard for Floating-Point Arithmetic」 = IEEE(米国電気電子学会)の浮動小数点演算規格 第754号
💬 1985年に初版が策定され、ほぼすべてのCPUがこの規格に従って小数を計算しているんだよ
← 用語集にもどる