TJH Asked: 2018-01-14 20:15:42 +0800 CST2018-01-14 20:15:42 +0800 CST 2018-01-14 20:15:42 +0800 CST mit-scheme中不准确的乘法[关闭] 772 我发现 mit-scheme 中的浮点乘法不准确,例如, 1 ]=> (* 1991.0 0.1) 会产生 ;Value: 199.10000000000002 你能帮忙解释一下奇怪的尾随数字“2”的出现吗? numeric-data lisp 2 个回答 Voted gdahlm 2018-01-14T20:32:17+08:002018-01-14T20:32:17+08:00 请记住,计算机是二进制的, 无论您愿意使用多少个以 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 和方案都将展示这种行为。 Best Answer NickD 2018-01-14T20:30:27+08:002018-01-14T20:30:27+08:00 这句话来自记忆,因此可能不太正确,但它传达了问题的本质:“对浮点数进行操作就像移动一堆沙子:每次你这样做,你都会失去一点沙子,你会得到一点污垢”(来自 Kernighan 和 Plauger 的“编程风格元素”IIRC)。每种编程语言都有这个问题。
请记住,计算机是二进制的,
无论您愿意使用多少个以 2 为底的数字,十进制值 0.1 都不能完全表示为以 2 为底的小数。
在 base2 1/10 是 0.0001100110011001100110011...(永远重复)
不幸的是,这是二进制浮点的结果,任何使用 FPU 的语言都会有类似的结果,比如 Python。
这是
Representation error
因为通常十进制分数不能完全表示为二进制(以 2 为底)分数。Perl、C、C++、Java、Fortran、Python 和方案都将展示这种行为。
这句话来自记忆,因此可能不太正确,但它传达了问题的本质:“对浮点数进行操作就像移动一堆沙子:每次你这样做,你都会失去一点沙子,你会得到一点污垢”(来自 Kernighan 和 Plauger 的“编程风格元素”IIRC)。每种编程语言都有这个问题。