浮点精度误差

时间:2013-12-10 09:05:43

标签: lisp common-lisp floating-accuracy lispworks

我遇到下面的LISP表达式问题。在对浮点数求和时,存在浮动精度错误。

CL-USER> (+ -380 -158.27 -35.52)

Actual:   -573.79004
Expected: -573.79000

请建议我如何在LISP中实现预期的结果(我正在使用Lispworks)。

2 个答案:

答案 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

另请参阅:*read-default-float-format*

答案 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

如果需要精确数字,请使用整数和比率

如果您想进行完全计算,则应使用integer s(例如,将货币表示为分数,而不是美元)或ratio s。