我对下面的 LISP 表达式有疑问。对浮点数进行求和时存在浮点精度错误。
CL-USER> (+ -380 -158.27 -35.52)
Actual: -573.79004
Expected: -573.79000
请建议我如何在 LISP 中达到预期的结果(我正在使用 Lispworks)。
我对下面的 LISP 表达式有疑问。对浮点数进行求和时存在浮点精度错误。
CL-USER> (+ -380 -158.27 -35.52)
Actual: -573.79004
Expected: -573.79000
请建议我如何在 LISP 中达到预期的结果(我正在使用 Lispworks)。
浮点数不一定准确。通常,实现具有单浮点数和双浮点数。也可能有短浮动和长浮动。
单浮子
CL-USER 7 > (+ -380 -158.27 -35.52)
-573.79004
现在有双花车:
CL-USER 8 > (+ -380 -158.27d0 -35.52d0)
-573.79D0
因此,LispWorks 有两种不同的浮点类型(可能短浮点是第三种,取决于 32 位或 64 位架构):
CL-USER 9 > (describe 35.52)
35.52 is a SINGLE-FLOAT
CL-USER 10 > (describe 35.52d0)
35.52D0 is a DOUBLE-FLOAT
浮点数表示具有一定精度的数学实数的子集,它们不是 精确的数字。四舍五入的错误是不可避免的。
ANSI Common Lisp 标准提供了4(!) 个浮点精度级别:short、single、double、long(所有实现都至少提供 2 个)。两者都不准确,但 ORACLE 可能正在使用double
,所以如果你坚持使用双打,你应该没问题。