IEEE 754の丸めモードの解説
5つのIEEE 754丸めモードについて学びます:最近接偶数への丸め(デフォルト)、+Infinity方向、-Infinity方向、ゼロ方向、およびタイは遠くへ。
Decimal Value
1.5
Float32 Hex
0x3FC00000
Float64 Hex
0x3FF8000000000000
詳細な説明
数学的結果が浮動小数点で正確に表現できない場合、最も近い表現可能な値に丸める必要があります。IEEE 754は5つの丸めモードを定義しており、それぞれ異なる特性と用途があります。
モード1: 最近接偶数への丸め(デフォルト)
事実上すべてのプログラミング言語とハードウェアのデフォルトモードです。正確な結果が2つの表現可能な値のちょうど中間にある場合、最下位仮数ビットが0のもの(つまり偶数)に丸めます。
例:
1.5は2に丸め(偶数)2.5は2に丸め(偶数)3.5は4に丸め(偶数)0.5は0に丸め(偶数)
これは「銀行家の丸め」とも呼ばれます。タイが常に切り上げられた場合に蓄積される統計的バイアスを防ぎます。
モード2: +Infinity方向への丸め(天井)
常に正の無限大方向に丸めます。正の値は切り上げ、負の値はゼロ方向に丸めます。
モード3: -Infinity方向への丸め(床)
常に負の無限大方向に丸めます。正の値はゼロ方向に、負の値は大きい絶対値方向に丸めます。
モード4: ゼロ方向への丸め(切り捨て)
常にゼロ方向に丸めます。余分なビットを丸めずに単に切り捨てます。Cでの整数変換のデフォルトです。
モード5: 最近接、タイはゼロから遠くへ
最近接への丸めと同様ですが、タイは偶数ではなくゼロから遠い方向に丸めます。学校で教わる丸め:0.5は1に、-0.5は-1に。
デフォルトが重要な理由:
最近接偶数への丸めは、誤差の蓄積を最小化するためデフォルトです。多数の演算にわたって、期待される誤差はゼロです(タイは半分の確率で切り上げ、半分で切り下げ)。他のモードは演算数に応じて増大する系統的バイアスを導入します。
実際に丸めモードを変更する:
ほとんどの言語は丸めモード制御を直接公開しません。Cではfesetround(FE_TONEAREST)などを使用します。JavaScriptでは丸めモードは常に最近接偶数への丸めで、基本的な算術では変更できません(ただしMath.round、Math.floor、Math.ceilは明示的な丸めを提供します)。
ユースケース
丸めモードの理解は、区間演算の実装、数値アルゴリズムの正しさの検証、特定の丸め規則が義務付けられている金融計算での作業、および異なるプラットフォーム間での浮動小数点結果の再現において重要です。