[英]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.