MIT 方案中的乘法不准确

MIT 方案中的乘法不准确

我发现 mit-scheme 中的浮点乘法不准确,例如,

1 ]=> (* 1991.0 0.1)

将产生

;Value: 199.10000000000002

您能帮忙解释一下奇怪的尾随数字“2”的出现吗?

答案1

请记住,计算机是二进制的,

无论您愿意使用多少个以 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 和scheme 都将演示这种行为。

答案2

这句话来自记忆,所以可能不太正确,但它传达了问题的本质:“对浮点数进行操作就像移动一堆沙子:每次你这样做,你都会失去一点沙子,同时也会得到一点沙子。”污垢”(来自 Kernighan 和 Plauger 的“编程风格的元素”IIRC)。每种编程语言都有这个问题。

相关内容