0.1
、3.14
、0.2
、および 2 の累乗の組み合わせで構成できないその他の値が、IEEE-754 形式では最終的に表現できない理由を理解しており、精度が許す限り最適に近似することができると言って、質問の前置きをさせてください。.
私が理解に苦しんでいるのは、値2 -23を表現しようとすると、わずかな誤差が生じる理由です。
2 -231.1920928955078e-7
は、またはと正確に等しくなり0.00000011920928955078
ます。単精度 IEEE-754 では、次のように構成できます。
- 符号ビットは
0
- バイアスされた指数は
104
(または0b01101000
バイナリで) 127 バイアスを考慮し-23
て、最終的な指数値になります。 - 仮数のビット フィールドは完全に
0
s で構成され、その最終的な値は1.0
、暗黙の1
-bit が考慮される場合です。
ただし、この特定のビット シーケンスをメモリに保存し、小数点以下 25 桁の精度で 10 進表記で出力すると、次のようになります。
0.0000001192092895507812500
^
|
margin of error starts here
この値には正確に の誤差が含まれています1.25e-21
。このインタラクティブ Web サイトでは、このエラー値を「変換によるエラー」と呼びます。
これを理解するのに苦労しています。たとえば、 のような値+3.14
を単精度ビットフィールドで正確に表現できない理由を理解しているからです。指数の値でスケーリングされた仮数部の 2 の負のべき乗の組み合わせは を正確に表すことができ3.14
ないため、次に近い近似値が選択されます。したがって、「変換によるエラー」が予想されます。それとは対照的に、値2 -23は単精度ビットフィールドに正確に格納できますが、10 進数表記に戻すとエラーが発生します。
明らかに私の側にある種の誤解がありますが、どこが正確かわかりません。