当总和本身显示为180时,为什么当我从两个角度的总和减去180时得到错误的答案?

时间:2017-12-02 23:00:52

标签: c++ double angle cos

该程序得到4个点(它们的坐标),形成一个凸形图,应该给我角度A2 +角度A4 - 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;
}

1 个答案:

答案 0 :(得分: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;