Почему я получаю неправильный ответ, когда вычитаю 180 из суммы двух углов, когда сама сумма показывает 180?

Программа получает 4 точки (их координаты), которые образуют выпуклую фигуру и должны дать мне угол А2 + угол А4 — 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;
}

0

Решение

Для вычисления с плавающей запятой мы можем использовать очень маленькое значение смещения для предельной ошибки, например 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;
1

Другие решения

Других решений пока нет …