2014-03-06 34 views
1

我有学习的Common Lisp了2个月,我遇到一个难题,这里是代码:CCL为什么轮不正确?

CL-USER> (round 33.6) 
34 
-0.40000153 

谁能解释呢?谢谢

+1

另请参阅[*每个计算机科学家应了解的浮点运算*,作者:David Goldberg](http://docs.oracle.com/cd/E19957-01/806-3568/ncg_goldberg.html)。 –

+1

另请参阅[在LISP中浮点的神秘问题 - 时间轴生成](http://stackoverflow.com/q/6225211/1281433),[在SBCL中的exp是错误的?](http://stackoverflow.com/q/4771346/1281433),[浮点精度错误](http://stackoverflow.com/q/20490115/1281433),[(球拍/计划)减法产生的结果令人难以置信的小幅度](http:// stackoverflow。 com/q/13693041/1281433),[为什么在Common Lisp中,当我运行参数为1的函数“acos”时,答案是错误的?](http://stackoverflow.com/q/17424545/1281433 ),... –

回答

4

我不知道我理解你的问题。在CLisp中,round取整为最接近的整数(除非指定除数)。与33.6最接近的整数是34,所以这个位是正确的。

而且,由于round返回商剩余部分,它给34,用的-0.4剩余部分。该位的主要是正确,所以我怀疑你想知道为什么它只是“主要”

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

CL-USER> (- 23.6 24) -0.39999962 

你会在为一个完美的世界将要返回-0.4但事实并非如此,原因上文提到的。

如果你想知道为什么是这样的话(即,如何浮点在幕后工作),你可以检查出thisthis作为例子。

+0

'CL-USER>( - 23.6 24) -0.39999962' –

+0

欲konw的datials低电平 –

+0

计算2之间浮动号码:CL-USER>(+ 25.2 2.2) 27.400002 –