[英]Trouble grasping "error due to conversion" in single-precision IEEE-754 when attempting to represent 2^(-23)
讓我先說這個問題,我理解為什么諸如0.1
、 3.14
、 0.2
之類的值和其他不能由兩個冪的組合組合的值最終無法用 IEEE-754 格式表示,並且它們可能只能近似為最佳精度允許。
我無法理解的是為什么嘗試表示值2 -23會導致輕微的誤差。
2 -23正好等於1.1920928955078e-7
或0.00000011920928955078
。 在單精度 IEEE-754 中,它可以構造如下:
0
104
(或二進制為0b01101000
)以說明 127 偏置,導致-23
成為最終指數值0
組成,當隱含的1
位被計算在內時,其最終值為1.0
然而,將這個特定的位序列存儲在 memory 中並以十進制表示法打印出來,小數點后有 25 位精度,結果如下:
0.0000001192092895507812500
^
|
margin of error starts here
該值恰好包含1.25e-21
的錯誤。 在此交互式網站上,此錯誤值稱為“轉換導致的錯誤”。
我很難理解這一點——因為我理解,例如,為什么像+3.14
這樣的值不能用單精度位域精確表示。 由指數中的值縮放的尾數中兩個負冪的組合不能精確表示3.14
,因此選擇下一個最接近的近似值。 因此,預計會出現“由於轉換而導致的錯誤”。 與此相反,值2 -23可以准確地存儲在單精度位域中,但是當轉換回十進制表示法時,會出現錯誤。
顯然我有某種誤解,但我無法弄清楚到底在哪里。
2 -23實際上並不完全等於1.1920928955078e-7
。
我用來執行計算的軟件將結果截斷了三位數字...... 2 -23的精確值恰好是0.00000011920928955078125
或1.1920928955078125e-7
,這是我之前觀察到的 output ,使其正確,沒有任何誤差。
同樣毫無意義的是,該網站提前將尾數的十進制表示形式截斷了幾位,使得手工計算(即,將尾數與符號位和 2指數相乘)看起來不正確(或至少略有偏差),當它們是事實上不是。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.