簡體   English   中英

為什么在浮點算術中0.9999999999999999!= 1但0.9999999999999999 + 1 == 2

[英]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.02.0的區間中小數部分的位數相比,在0.51.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位。 它不能以浮點格式表示,因此必須四舍五入以適合。 兩個最接近的可表示值是:

  • (2 54 -2)/ 2 53 =(2 53 -1)/ 2 52 ,並且
  • (2 54 −0)/ 2 53 = 2。

這些都與精確的數學結果相差甚遠。 打破平局的規則是在其有效位的低位使用值為零的值。 (即使我在這里將有效數字表示為整數,但它是浮點格式的“左對齊”分數,因此分子1對應於二進制數字1.000000…000 2。

因此,將1加到0.9999999999999999 ,計算結果必須四舍五入到2。

暫無
暫無

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

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