我发现 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)。每种编程语言都有这个问题。