我正在上几门有关机器学习的课程,并且试图理解这个计算问题:

variable = 1000000000 #1 billion
for i in xrange(1000000):
       variable = variable+ 1e-6 #0.000001

variable = variable -1000000000 #1 subtracts with 1 billion again
variable
#>> 0.95367431640625


应该为1,但结果为0.95367431640625

有人可以告诉我为什么会这样吗?

最佳答案

您正在失去精度。这是因为Python中的float实现了double floating point精度,只能保证精度达到15/16位。

当您这样做时:

1,000,000,000 + 0.000001
1,000,000,000.000001 + 0.000001
# and so on, note that you are adding the 16-th digit
# but 1,000,000,000.000001 is not actually exactly 1,000,000,000.000001
# behind is something like 1,000,000,000.000001014819 or 1,000,000,000.000000999819


不断地,您正在打破精度极限,在1中最后一个0.000001之后还有其他一些值,这些值仅表示为0.000001。这样就得到了累积误差。

例如,如果将variable初始化为0,情况将会有所不同。这是因为在计算中:

0.000000 + 0.000001
0.000001 + 0.000001
0.000002 + 0.000001
#and so on


尽管0.000001的实际值不完全是0.000001,但是16位数字的不精确度与有效数字相差甚远:

0.000000 + 0.00000100000000000000011111
0.000001 + 0.00000100000000000000011111 #insignificant error


您也可以通过使用decimal值而不是double来避免该错误:

from decimal import *
variable = Decimal(1000000000)
addition = Decimal(1e-6)
for i in xrange(1000000):
   variable = variable+ addition #0.000001

variable = variable-Decimal(1000000000) #1 subtracts with 1 billion again
variable

关于python - 了解数值稳定性,计算量大,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/35919315/

10-12 16:29