2017-12-02 120 views
0

該程序獲得4點(他們的座標),形成一個凸形的圖形,應該給我角度A2 +角度A4 - 180度。對於例如:當總和本身顯示爲180時,爲什麼我從兩個角度的總和中減去180時會得到不正確的答案?

1 3 
0 2 
1 1 
2 2 

我得到UA2 = 90和UA4 = 90,但是當我做UA2 + uA4-180我得到2.0568e-007,而不是0但是,當我做到這UA2 + UA4我得到180.如果有人問到類似的問題,我很抱歉,但我不知道如何搜索它。任何人都可以告訴我爲什麼會發生,我如何修復它以顯示正確的答案?代碼:

#include <iostream> 
#include <fstream> 
#include <cmath> 

#define PI 3.14159265 

using namespace std; 

ifstream f("date.in"); 

struct punct 
{ 
    double x,y; 
}A1,A2,A3,A4; 

int main() 
{ 
    double uA2,uA4; 
    f>>A1.x>>A1.y>>A2.x>>A2.y>>A3.x>>A3.y>>A4.x>>A4.y; 
//calculate cos of both angles 
    uA2=((A1.x-A2.x)*(A3.x-A2.x)+(A1.y-A2.y)*(A3.y-A2.y))/ 
      (sqrt((A1.x-A2.x)*(A1.x-A2.x)+(A1.y-A2.y)*(A1.y-A2.y))*sqrt((A3.x-A2.x)*(A3.x-A2.x)+(A3.y-A2.y)*(A3.y-A2.y))); 
    uA4=((A1.x-A4.x)*(A3.x-A4.x)+(A1.y-A4.y)*(A3.y-A4.y))/ 
      (sqrt((A1.x-A4.x)*(A1.x-A4.x)+(A1.y-A4.y)*(A1.y-A4.y))*sqrt((A3.x-A4.x)*(A3.x-A4.x)+(A3.y-A4.y)*(A3.y-A4.y))); 
//calculate angles 
    uA2=acos(uA2)*180.0/PI; 
    uA4=acos(uA4)*180.0/PI; 
//the part that gives me an incorrect answer 
    cout<<uA2+uA4-180<<endl; 
} 
+4

的[是浮點運算壞了嗎?](https://stackoverflow.com/questions/588004/is-floating-point-math-broken) –

+0

我通過計算也有這個問題,可能的複製'罪(2 * PI)'這也返回這個值而不是0.所以我認爲這些功能不是很精確? –

+0

浮點數學是一個近似值。這是簡單的原因 - 更多地閱讀它,轉到指定的鏈接或對該主題進行谷歌搜索。 – PaulMcKenzie

回答

1

對於浮點計算,我們可以使用一些非常小的偏移值作爲邊緣錯誤,例如1e-6。

double diff = uA2 + uA4 - 180, threshold = 1e-6; 
    if (diff < threshold && diff > -threshold) cout << "0" << endl; 
    else cout << diff << endl; 
    // cout<<uA2+uA4-180<<endl; 
相關問題