7

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

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

Actual:   -573.79004
Expected: -573.79000

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

4

2 回答 2

10

浮点数不一定准确。通常,实现具有单浮点数和双浮点数。也可能有短浮动和长浮动。

单浮子

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

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

于 2013-12-10T09:17:36.267 回答
5

浮点数不准确

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

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

理论

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

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

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

于 2013-12-10T14:21:58.757 回答