繁体   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