Lisp 浮点精度误差

Lisp 浮点精度误差,lisp,common-lisp,floating-accuracy,lispworks,Lisp,Common Lisp,Floating Accuracy,Lispworks,我对下面的LISP表达式有问题。对浮点数进行求和时存在浮点精度错误 CL-USER> (+ -380 -158.27 -35.52) Actual: -573.79004 Expected: -573.79000 请建议我如何在LISP中实现预期结果(我使用的是Lispworks)。浮点数不一定精确。通常一个实现有单浮点数和双浮点数。也可能有短期和长期浮动 单浮子 CL-USER 7 > (+ -380 -158.27 -35.52) -573.79004 现在使用双浮动:

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

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

Actual:   -573.79004
Expected: -573.79000

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

浮点数不一定精确。通常一个实现有单浮点数和双浮点数。也可能有短期和长期浮动

单浮子

CL-USER 7 > (+ -380 -158.27 -35.52)
-573.79004
现在使用双浮动:

CL-USER 8 > (+ -380 -158.27d0 -35.52d0)
-573.79D0
因此,LispWorks有两种不同的浮点类型(短浮点可能是第三种,取决于32位或64位体系结构):

另请参见:。

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

ANSI通用Lisp标准提供了(所有实现至少提供2个)。两者都不确切,但ORACLE可能使用的是
double
,因此如果您坚持使用double,您应该不会有问题

理论 请阅读

如果需要精确的数字,请使用整数和比率
如果你想进行精确的计算,你应该使用s(例如,用美分表示货币,而不是美元)或s。

如果你用一定精度的浮点计算,你为什么还要做其他事情呢,我正在将一个应用程序从ORACLE移植到lisp,ORACLE应用程序给出-573.79000,但lisp返回-573.79004。在测试应用程序的最终结果时,这导致了许多不匹配。@Bigyansr听起来您的测试需要一个更宽的阈值。特别是,您希望接受0.00005以内的任何值。
CL-USER 9 > (describe 35.52)

35.52 is a SINGLE-FLOAT

CL-USER 10 > (describe 35.52d0)

35.52D0 is a DOUBLE-FLOAT