2

Задание: Даны три действительных числа: a, b, c. Проверьте, выполняется ли равенство a+b=c.

Формат выходных данных: Если равенство выполняется, выведите «YES», если не выполняется, выведите «NO».

В чем моя ошибка?

#include <iostream>
#include <iomanip>
#include <cmath>
using namespace std;

int main(){
long double a, b, c;
cin >> a >> b >> c;
if (a + b == c){
cout << "YES";
}
else
cout << "NO";
return 0;
}

введите сюда описание изображения

Kromster
  • 13,809
  • Если год назад дан ответ на похожий вопрос , то это не делает данный вопрос дубликатом. Я отмечаю как полезный вопрос – AR Hovsepyan May 01 '18 at 20:45

1 Answers1

1

Тут не столько ошибка, сколько незнание представления чисел с плавающей точкой в компьютере. Не вдаваясь сильно в теорию, при инициализации нового значения double или float, есть вероятность, что вы присвоите не 0.3, а 0.300000000000001. Ну и выходит проблема при сравнении.

В случае с С++, можно воспользоваться следующей фичей : std::numeric_limits<double>::epsilon() - это следующее число после 1.0.

Ну и пример использования в коде:

#include <iostream>
#include <limits>
#include <cmath>
using namespace std;

bool compare(double a, double b) {
    return std::fabs(a - b) < std::numeric_limits<double>::epsilon();
}

int main(){
    double a,b,c;
    cin >> a >> b >> c;
    if (compare(a + b, c)) 
        cout << "YES";
    else
        cout << "NO";
}
koshachok
  • 816