2015-09-03 40 views
-1

我有一個包含非負雙打的向量。我想區分條目等於零和條目大於零的情況。雙零的數值穩定性

只是檢查(a> 0.0)還是可以導致問題的數字安全?對於非零值,我沒有先驗下限,機器精度除外。我應該創建一個包含整數的輔助向量來標記零值以進行安全檢查嗎?

爲了更好的理解:向量的條目類似於圖上的權重,我想我不需要鄰接矩陣來跟蹤圖拓撲。

編輯:我的問題是:可以和將0.0確切地表示在雙打?

+0

「數字安全」是什麼意思? –

+0

如果我將值賦值給雙變量var,隨後的var> 0.0肯定會產生錯誤?後續的var == 0.0是否會產生真實的結果?我記得幾乎所有的浮點數,至少第二個陳述不會是真的。 –

+0

因此,在'double x = 0.0'後,爲什麼你認爲'x == 0.0'可能是錯誤的? –

回答

4

浮點數字不是字面上的邪惡。他們也不是由愚蠢的人設計的。您需要關注的唯一問題是四捨五入

設置爲零的數字將爲零。沒有理由設計一個不以這種方式行事的計算系統。

設置爲0.1的數字不會是0.1,因爲0.1不完全可表示,因此會四捨五入爲最接近的可表示數字;詳情請參閱Is floating point math broken?。但是,如果將兩個變量設置爲0.1,則它們將相互比較相等,因爲0.1每次都以相同方式進行四捨五入。 (實際上,舍入在編譯期間發生;在運行時,您只需將變量設置爲預先舍入的值。)

類似地,設置爲0.1 * 3-0.3的數字可能不等於零,因爲0.1被四捨五入,然後四捨五入的結果乘以3和結果四捨五入,依此類推。

所以這個問題不是表示的問題,而是計算問題。如果你將某些東西設置爲特定值,那就是它的價值。如果它通過一系列不精確的計算來到那裏,你不能依賴精確的相等。

+0

自從我花了3周的時間教計算機中浮點數的問題以來,我認爲在做如上所述的操作時,最糟糕的可能會發生。感謝您提供一些界限,我可以安全地工作。 –