【问题标题】:Why round is incorrect in CCL?为什么CCL中的round不正确?
【发布时间】:2014-04-08 10:17:48
【问题描述】:

我学习 Common Lisp 2 个月了,遇到一个难题,代码如下:

CL-USER> (round 33.6)
34
-0.40000153

有人解释一下吗?谢谢

【问题讨论】:

标签: lisp common-lisp floating-point-precision ccl


【解决方案1】:

我不确定我是否理解您的问题。在 CLisp 中,round 舍入到最接近的整数(除非您指定除数)。与33.6 最接近的整数是34,因此该位是正确的。

由于round 返回商 余数,它给出34,余数为-0.4。这一点大部分是对的,所以我怀疑你想知道为什么它只是“大部分”。

不完全是-0.4 的原因几乎可以肯定是由于浮点数的精度有限。计算(看似精确的)浮点数和整数之间的差异的结果可能令人惊讶:

CL-USER> (- 23.6 24) -0.39999962

在一个完美的世界里,你会期望它返回-0.4,但由于上述原因,它没有。

如果您想知道为什么会出现这种情况(即浮点如何在幕后工作),您可以查看thisthis 作为示例。

【讨论】:

  • CL-USER> (- 23.6 24) -0.39999962
  • 我想了解底层数据
  • 在 2 个浮点数之间计算:CL-USER> (+ 25.2 2.2) 27.400002
  • @Hercules,我已经更新了答案,以便向您指出有关浮点缺陷的其他问题。
  • @HerculesShek 你可以在 LISP 中使用disassemble 来真正了解算术运算所发生的事情,但你会发现,在那个级别上,它与任何其他语言没有太大区别你真的在处理一般的浮点精度问题。
猜你喜欢
  • 2012-09-09
  • 2015-09-21
  • 2019-08-20
  • 2022-11-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-01-14
  • 1970-01-01
相关资源
最近更新 更多