2014-03-06 66 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 –