您正在失去精確度。這是因爲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
不斷,你破壞了精度的限制,也有在0.000001
最後1
其僅作爲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
來源
2016-03-10 14:38:39
Ian
看起來像典型的浮點問題 - 計算機不能真正代表這些數字通過位,所以它變得「接近」,但你會得到一些錯誤和15或16位有效數字(小數點前9或10,小數點後6 )聽起來符合C語言中的'float'(我通常粗略地談論;我不知道具體情況,否則我會發布爲答案,而不是評論)。 – dwanderson
此外,爲什麼這個標籤爲'performancecounter'?這似乎與「性能」沒有任何關係,而與準確性有關。 – dwanderson
一些細節,以防止這個問題可以找到[這裏](http://stackoverflow.com/questions/11522933/python-floatingpoint-arbitrary-precision-available)。 –