Numeric-Data

mit-scheme 中的不准確乘法

  • January 29, 2018

我發現 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 和方案都將展示這種行為。

引用自:https://unix.stackexchange.com/questions/416958