2010-05-03 55 views
0

看到this post about floating point errors on slashdot,我得到了好奇 其他種類的存在來處理此類浮點舍入誤差的解決方案。那麼你從中學到的浮點錯誤是什麼,你從中學到了什麼?你如何處理浮點舍入問題?

編輯:我是一個項目,我們需要處理大量的浮點運算內工作,所以我希望能得到一些答案,可以幫助我避免了一些事情,他們正在成爲問題之前。我會接受這個答案,這個答案給了我超越「用epsilon比較一切」的最新見解。

+1

沒有一個具體答案的具體問題 - 需要是CW? – 2010-05-03 07:41:28

回答

2

儘量避免添加不同數量的數字。例如,單精度算術中的10^8+1==10^8。你可以通過移動到雙精度來解決這個問題,但是然後10^8+1.00000001==10^8+1 ...這個分數會丟失。

如果所有進入一些線性代數的數字有偏差,首先去除偏移。所以,給定1000001, 1000003.9, 1000002.5, …,在做任何事之前減去一百萬,並在最後加回。

綜上所述少量的一個非常大的順序,即先總結較小的子序列所以在最後的數字沒有得到過分圓潤。

要數乘以一個非常大的順序,增加他們對數以避免溢出或下溢。

-1

我不認爲你真的擔心它,除非你正在處理的非常小的數字和/或非常大的數字......如果這是一個問題,無論是使用某種「小數」類的,或選擇一個更穩定的算法。

我不認爲這曾經實際上在過去咬我,但我很興奮,當它發生在我的同齡人之一,我清楚地知道什麼是錯的:d

+1

另一個問題是數量完全不同的數量級。一小部分(我們稱之爲dx)添加到更大的數字(我們稱之爲x)可能會完全下溢。所以你可以有x = x + dx可以運行一百萬次的情況,而x保持不變。 – wisty 2010-05-03 06:47:21

+0

-1:在許多情況下,您需要了解浮點運算的精度有限 - 採用諸如*「我不認爲您真的不必擔心它,除非您處理的是非常小的數字和/或非常大的數字「*只是要求麻煩。 – 2010-05-03 07:43:07

+0

@wisty:這就是我的意思是「小數和大數」。 @保羅:嗯......那麼,每次你使用浮球時,你應該仔細檢查每一次計算?我的意思是,如果你在精確度很重要的地方運行一些複雜的算法,那麼當然可以考慮一下,但是大多數情況下,當它成爲問題時可以修復它。除非它是任務關鍵型軟件。 – mpen 2010-05-04 01:38:45

1

我學會了永遠比較兩個花車的平等。相反,我總是嘗試說出我的邏輯,以便比較總是小於或大於條件。比較浮動與零是特別討厭的。