2011-06-05 21 views
1

我做的:最大值CAS:浮法老鼠替換千里馬

(%i1) 1.4*28; 

(%o1) 39.2 

(%i2) is(1.4*28=39.2); 

(%o2) false 

這是奇怪,我,但可能有做與鼠更換?

有沒有辦法讓最大值返回「真」到輸入 is(1.4*28=39.2);

回答

3

The Floating-Point Guide

爲什麼我的數字,像0.1 + 0.2加起來一個漂亮的圓0.3, 而是我得到一個怪異的結果像 0.30000000000000004?

因爲內部,計算機使用 格式(二進制浮點),該 不能準確地表示多個 像0.1,0.2或0.3的。

當代碼被編譯或解釋 ,你的「0.1」是已經 四捨五入至在於 格式最接近的數字,這導致一個小 舍入誤差的 計算髮生甚至之前。

在你的情況下,1.4和39.2都不能完全表示爲二進制小數部分,並且計算結果的結果與字面值39.2不同。

如果你想避免這樣的問題,你必須避免使用二進制浮點數。我認爲,在千里馬,這是最容易做到用適當的分數:

is(14/10 * 28 = 392/10) 

應該工作

+0

謝謝邁克爾。事實上,最大限度地喜歡有理性,你很好地描述我的問題。然而,你的solutino不適合我,因爲我得到的用戶輸入可以是任何東西;特別是花車將被大量使用。最大值是不是有一種方法可以作爲一個具有浮點數的高級計算器? – mmzc 2011-06-13 07:20:58

3

由於「常規」計算器會得到這樣的問題錯了,有時,也不清楚什麼會真正解決您的問題。如果您正在設置一個自動算術測試來查看人們是否能夠得到正確的答案,那麼也許您應該測試的是達成一定的容忍度。 (你的計算器的例子可以通過計算1.0/3.0的變化,然後乘以3來構造。你可能得到0.9999 ......某些計算器比其他計算器更好,所以這些例子必須稍微微妙一些。 1.0/30.0 X 30.0)

再回到千里馬,你可以測試一下,看看是否ABS(AB)<寬容,或許 ABS((AB)/ MAX(A,b))< relativetolerance。

現在,如果能真正解決您的問題的是OUTPUT上的精度較低,您可以設置fpprintprec:5以獲得5位十進制數字(四捨五入)。

另一種方法是讀取您的數字,以使3.1實際上永遠不會轉換爲二進制,但最初解析爲3 + 1/10。從那一刻起,所有的理性算術都可以完成。 (理性算術不包括平方根,日誌,餘弦...,只是+ - * /和整數冪)。這現在不是Maxima的一部分。順便說一句,你的0.1 + 0.2的例子在wxmaxima的顯示中顯示爲0.3。但它隱藏了實際價值,因爲%-3/10實際上不是零。 玩fpprec:50;我們可以代表0.3,仍然是二進制的,但是通過輸入0.3b0代表更多的數字。

0.1 + 0.2-0.3b0; 給4.440892098500626161694526672363281263363823550461b-17

哦,如果你是通過郵件關心千里馬轉換 花車到有理數,設置ratprint:假的。它不會改變計算,只是警告。

+0

感謝您的回答。我記得高中時計算器的容忍度,但當時從未真正理解。
的確,我們已經轉向基於容差的系統。 – mmzc 2011-07-28 12:39:46