我正在上几门有关机器学习的课程,并且试图理解这个计算问题:
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/