Python 为什么,在浮点运算中,0.99999999999=1但0.99999999+;1 == 2
我知道这一定是另一个浮点精度问题:设x为0.9999999999。然后在浮点运算中x+1==2,但是x!=1.发生了什么事?下面是我在ipython控制台上尝试的内容Python 为什么,在浮点运算中,0.99999999999=1但0.99999999+;1 == 2,python,floating-point,precision,Python,Floating Point,Precision,我知道这一定是另一个浮点精度问题:设x为0.9999999999。然后在浮点运算中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表示错误,这似乎不是这里的主要原因 在0.5到1.0的间隔内,与1.0到2.0的间隔内小数部分的
In [55]: x = 0.9999999999999999
In [56]: x==1
Out[56]: False
In [57]: x+1==2
Out[57]: True
[编辑]关于浮点计算中断的现有问题主要是关于FP表示错误,这似乎不是这里的主要原因 在
0.5
到1.0
的间隔内,与1.0
到2.0
的间隔内小数部分的位数相比,小数部分多了一位。所以这是意料之中的
您可以使用另一个示例:
0.9999999999 + 1234567890.0
其中第一个加数中有十位数字9
双精度(即64位)(二进制)浮点类型的精度约为十六位十进制数字。因此,一个数字只能从大约16位数字的“第一位”(即最高有效位)记忆。您使用的浮点格式的有效位中有53位。这意味着它可以将数字表示为53位整数乘以或除以二的幂 当
0.9999999999999
转换为该格式时,最接近的可表示值为(253−1) /253,正好是0.999999999988897769753748434595763683319091796875。请注意,分子正好使用53位
当你加1时,数学结果是(254−1)/253. 分子将有54位。这不能用浮点格式表示,因此必须四舍五入以适应。两个最接近的可表示值为:
- (254)−2)/253 = (253−1) /252,以及
- (254)−0)/253=2
因此,当将1添加到
0.9999999999999
中时,计算结果必须四舍五入到2。可能重复的“查看我的编辑”。这不是重复的imho。