簡體   English   中英

為什么0.1的浮點表示以1結尾?

[英]Why does the floating point representation of 0.1 end in 1?

我一直在寫一個小數到單精度 IEEE754 浮點轉換器,我發現了一些數字的差異,比如 0.1 和 0.2

讓我們取 0.1,第一步是將其轉換為簡單的二進制表示(將小數部分乘以 2 並取整數部分)這給了我一個眾所周知的循環二進制模式(001100110011 ...)

0.1(最多 26 位)的最終二進制表示為 0. 00 0110 0110 0110 0110 0110 0110。

為了將其放入 32 位浮點數,下一步是通過將小數點向右移動 4 次,刪除前導 1.,並將其截斷為 23 位來對其進行歸一化。 這給我留下了 10011001100110011001100。大多數編程語言給我 10011001100110011001101(最后一位是 1 而不是 0)。 我在這里做錯了什么?

... 刪除前導 1.,並將其截斷為 23 位。

錯誤操作: round ,而不是truncate 錯誤的操作順序 - 舍入,然后刪除前導 1。

...仍然不知道它是如何被翻轉的

無限精確的二進制答案四舍五入到最接近的float


對於普通的float32 ,有效數是 24 位*1 超過 24 位的值的轉換通常是一個round *2 ,而不是截斷。 其余位是 110_0110_...

        123 4567 8901 2345 6789 0123 4
0 . 00 0110 0110 0110 0110 0110 0110 0110 0110 ...
        ^----------------------------^
0 . 00 0110 0110 0110 0110 0110 0110 1 rounded
         10 0110 0110 0110 0110 0110 1 encoded 23-bits

舍入發生在前導位作為編碼的一部分被刪除之前,因為最高有效位的位置可能會改變。


筆記:

0.000110011001100110011001100           (binary) = 0.0999999940395355224609375000 (decimal)
0.0001100110011001100110011001100110... (binary) = 0.1                            (decimal)
0.000110011001100110011001101 (closer)  (binary) = 0.1000000014901161193847656250 (decimal)
 
        

*1隱含最高有效 1 位,顯式編碼 23 位。
*2四舍五入到最接近,並列到偶數。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM