2012-10-29 126 views
2

可能重複:
How should I do floating point comparison?如果聲明 - 不正確評估

這是一個代碼片段,我想不出有什麼地方錯了。

if語句正在錯誤地評估數字並轉到「else」。

double m,k; 

m = (y3-y1)/(x3-x1); 
k = m*(-x1)+y1; 

cout <<"\n\n"<< m <<" "<< k << "\n"; 
cout <<"\n\n"<< ((-a)/b) <<" "<< c/b << "\n"; 

if(m==((-a)/b) && k==c/b) 
{ 
    cout << "\nTaisne sakrīt ar kādu no trīsstūra malām!" << endl; 
    goto beigas; 
} 
    else 
    cout << "\n\n WRONG \n\n"; 

用戶輸入值X1,Y1,X3,Y3,A,B,C - 都是

它似乎只適用於「m」。而令人奇怪的是,當我嘗試以下,if語句是真的有相同的價值觀:

if(m==((-a)/b) && k<c/b) 

下面是截圖讓整個問題:

http://i49.tinypic.com/307n88l.jpg

的代碼開始用戶輸入完所有的值後。

謝謝,任何幫助將不勝感激!

當您要比較兩個浮點
+12

浮點運算不準確。 – chris

+0

變量的值是什麼? – Yohannes

+0

@ chris的擔心可以通過檢查c/b-k是否小於某個小值來解決。 – BostonJohn

回答

0

使用這樣一個閾值:

double m = a/b; 

if (abs(m - (a/b)) < 0.0001) 
{ 
    // execute code where m == a/b here 
} 

所以基本上比較浮點/雙精度減去他們,並確保其結果是低於某一閾值。

+2

像0.0001這樣的常數閾值可能是最好的方法,也可能不是。確定兩個浮點值是否足夠接近以被認爲「相等」可能是困難的;它可以取決於值的計算方式以及它們的含義。 –

+1

該方法減少了錯誤的否定(不正確地拒絕相等),但增加了錯誤的肯定(錯誤地接受了平等)。在不知道應用程序的要求的情況下,您無法知道這是否是正確的解決方案。 –

+0

謝謝,它解決了這個問題。儘管我還需要對其他地方的代碼進行一些修改,以使整個程序能夠正常工作。此外,計算工作的失誤率略低,例如0.01%,但在我的情況下這是可以承受的。 現在我會知道在處理浮點數時你必須有不同的方法。 –