我想了解這個簡單例子背後的浮點算術。兩種碼在理論上在算術上是等價的,但顯然一系列的加法比單純的乘法增加了更多的誤差。浮點算術:總結與乘積錯誤
s=0.0
for i in range(10):
s += 0.1
print(s)
print('%.30f' % s)
0.9999999999999999
0.999999999999999888977697537484
但:
s=0.1
s *= 10
print(s)
print('%.30f' % s)
1.0
1.000000000000000000000000000000
我想明白是怎麼回事幕後。
據我瞭解,小數0.1的二進制表示從未準確,可以通過驗證:
print(0.1)
print('%.30f' % 0.1)
0.1
0.100000000000000005551115123126
所以在求和的順序,將餘下部分5.55e-18
保持加起來變量,很快速增長。
但是,當乘法時,我認爲同樣的餘數也會增加,它會增加,但是這不會發生。這是爲什麼?轉換爲二進制之前的任何優化?
感謝您的詳細解釋。現在有道理。 – Raf
可能值得補充的是,取整爲53位與IEEE-754浮點運算有關。 [https://docs.python.org/3/tutorial/floatingpoint.html#representation-error] – Raf