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).
浮点数不一定准确.通常,实现具有单浮动和双浮动.可能还有短而长的花车.
单浮
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*.
浮点数表示具有一定精度的数学实数的子集,它们不是 精确的数字。舍入错误是不可避免的。
ANSI Common Lisp 标准提供了4(!) 个浮点精度级别:short、single、double、long(所有实现至少提供 2 个)。两者都不准确,但 ORACLE 可能正在使用double,所以如果你坚持使用双打,你应该没问题。
如果您想进行精确计算,您应该使用integers(例如,将货币表示为美分,而不是美元)或ratios。