我遇到下面的LISP表达式问题。在对浮点数求和时,存在浮动精度错误。
CL-USER> (+ -380 -158.27 -35.52)
Actual: -573.79004
Expected: -573.79000
请建议我如何在LISP中实现预期的结果(我正在使用Lispworks)。
答案 0 :(得分:9)
浮点数不一定准确。通常,实现具有单浮动和双浮动。可能还有短而长的花车。
单一浮动
CL-USER 7 > (+ -380 -158.27 -35.52)
-573.79004
现在有双浮动:
CL-USER 8 > (+ -380 -158.27d0 -35.52d0)
-573.79D0
LispWorks因此有两种不同的浮点类型(可能是short-float是第三种,取决于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
答案 1 :(得分:4)
浮点数表示具有某些精度的数学实数的子集,它们不 精确数字。舍入错误不可避免。
ANSI Common Lisp标准提供4(!) levels of float precision: short, single, double, long(所有实现至少提供2个)。两者都不准确,但是ORACLE可能正在使用double
,所以如果你坚持使用双打,你应该没事。
请阅读What Every Computer Scientist Should Know About Floating-Point Arithmetic。