2016-03-19 101 views
-2

我在這裏有奇怪的問題比較,請參閱:雙重價值的變化,當我需要與其他價值

我有一個程序,在那裏我閱讀* .txt文件和存儲到矩陣double matrix[][]的一些價值,至今太好了。

看值:

-0.5 -0.5 -0.5 -0.5 -0.5 -0.5 -0.5 -0.5 -0.5 -0.5 -0.5 -0.5 -0.5 
-0.5 -0.5 -0.5 -0.5 -0.5 -0.5 -0.5 -0.5 -0.5 -0.5 -0.5 -0.5 -0.5 
-0.5 -0.5 -0.5 -0.5 -0.5 -0.5 -0.5 -0.5 -0.5 -0.5 -0.5 -0.5 -0.5 
-0.5 -0.5 -0.5 -0.5 -0.5 -0.5 -0.5 -0.5 -0.5 -0.5 -0.5 -0.5 -0.5 
-0.5 -0.5 -0.5 -0.5 -0.5 -0.5 -0.5 -0.496094 -0.5 -0.5 -0.5 -0.5 

我已經打印此文件和所有都OK,

for (int i = 0; i < 64; ++i) { 
    std::cout << matrix[0][i] << " "; 
} 

,但在我的程序的其他時刻,我需要與其他的價值觀和我比較這值有驚喜所有值-0.5都可以,但值-0.496094不是,該值更改爲-0,49609399999999998

所以當我做這個

double data[]; 
if (data[0] == matrix[0][59]) { 

} 
//the result always is false :/ 

有某種原因發生的呢?

+0

歡迎使用浮點/雙精度值。你應該投入一些時間來研究浮點數的實際表示方式,二進制和侷限性。 「.496094」必須是一個非理性數字,以基數2浮點數表示時,並且如果由於不同的數學運算而得出不同的結果,則不會與所謂的相同數字進行比較。 –

+0

Sam Varshavchik你的建議是什麼? –

回答

0

這是因爲數字-0.496094不能100%精確地表示爲雙精度。會發生什麼,它被分配最接近的可表示的雙倍,即-0.49609399999999998。這是正確的行爲。我建議查找浮點精度。

對此的一個說明是==常常是在浮點數上使用錯誤的運算符,而如果謂詞滿足要通過某個閾值,則應該檢查它是否大於閾值>。