Numeric-Data
mit-scheme 中的不准確乘法
我發現 mit-scheme 中的浮點乘法不准確,例如,
1 ]=> (* 1991.0 0.1)
會產生
;Value: 199.10000000000002
你能幫忙解釋一下奇怪的尾隨數字“2”的出現嗎?
這句話來自記憶,因此可能不太正確,但它傳達了問題的本質:“對浮點數進行操作就像移動一堆沙子:每次你這樣做,你都會失去一點沙子,你會得到一點污垢”(來自 Kernighan 和 Plauger 的“程式風格元素”IIRC)。每種程式語言都有這個問題。
請記住,電腦是二進制的,
無論您願意使用多少個以 2 為底的數字,十進制值 0.1 都不能完全表示為以 2 為底的小數。
在 base2 1/10 是 0.0001100110011001100110011…(永遠重複)
不幸的是,這是二進制浮點的結果,任何使用 FPU 的語言都會有類似的結果,比如 Python。
In [1]: 1991.0 * 0.1 Out[1]: 199.10000000000002 In [2]: 0.1 + 0.2 Out[6]: 0.30000000000000004
這是
Representation error
因為通常十進制分數不能完全表示為二進制(以 2 為底)分數。Perl、C、C++、Java、Fortran、Python 和方案都將展示這種行為。