浮点精度误差

big*_*shr 5 lisp common-lisp floating-accuracy lispworks

我对下面的LISP表达式有疑问.在对浮点数求和时,存在浮动精度错误.

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

Actual:   -573.79004
Expected: -573.79000
Run Code Online (Sandbox Code Playgroud)

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

Rai*_*wig 9

浮点数不一定准确.通常,实现具有单浮动和双浮动.可能还有短而长的花车.

单浮

CL-USER 7 > (+ -380 -158.27 -35.52)
-573.79004
Run Code Online (Sandbox Code Playgroud)

现在有双浮点数:

CL-USER 8 > (+ -380 -158.27d0 -35.52d0)
-573.79D0
Run Code Online (Sandbox Code Playgroud)

因此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
Run Code Online (Sandbox Code Playgroud)

另见:*read-default-float-format*.


sds*_*sds 5

浮动不准确

浮点数表示具有一定精度的数学实数的子集,它们不是 精确的数字。舍入错误是不可避免的

ANSI Common Lisp 标准提供了4(!) 个浮点精度级别:short、single、double、long(所有实现至少提供 2 个)。两者都不准确,但 ORACLE 可能正在使用double,所以如果你坚持使用双打,你应该没问题。

理论

请阅读每个计算机科学家应该知道的关于浮点运算的知识

如果您想要确切的数字,请使用整数和比率

如果您想进行精确计算,您应该使用integers(例如,将货币表示为美分,而不是美元)或ratios。