![](/img/trans.png)
[英]Why is the floating-point variable of the subclass the same memory address as the floating-point variable of the parent class?
[英]Why, in floating-point arithmetic, 0.9999999999999999 !=1 but 0.9999999999999999 + 1 == 2
我知道這一定是另一個浮點精度問題:令x為0.9999999999999999。 然后x + 1 == 2用浮點運算,但是x!=1。這是什么情況? 以下是我在ipython控制台上嘗試過的內容。
In [55]: x = 0.9999999999999999
In [56]: x==1
Out[56]: False
In [57]: x+1==2
Out[57]: True
[編輯]關於浮點計算中斷的現有問題主要與FP表示錯誤有關,這似乎不是這里的主要原因。
與從1.0
到2.0
的區間中小數部分的位數相比,在0.5
到1.0
的區間0.5
數部分具有一位。 因此,這是預期的。
您可以使用另一個示例:
0.9999999999 + 1234567890.0
第一個加數中有十個數字9
。
雙精度(即64位)(二進制)浮點類型的精度約為16個十進制數字。 因此,只能從大約16位數字的“第一個”(即最高有效位)起記住一個數字。
您使用的浮點格式的有效位數為53位。 這意味着它可以將數字表示為一個53位整數乘以或除以2的冪。
將0.9999999999999999
轉換為該格式時,最接近的可表示值為(2 53 -1)/ 2 53 ,恰好是0.99999999999999988897769753748434595763683319091796875。 請注意,分子正好使用53位。
當您添加1時,數學結果將是(2 54 -1)/ 2 53 。 分子將具有54位。 它不能以浮點格式表示,因此必須四舍五入以適合。 兩個最接近的可表示值是:
這些都與精確的數學結果相差甚遠。 打破平局的規則是在其有效位的低位使用值為零的值。 (即使我在這里將有效數字表示為整數,但它是浮點格式的“左對齊”分數,因此分子1對應於二進制數字1.000000…000 2。 )
因此,將1加到0.9999999999999999
,計算結果必須四舍五入到2。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.