Посмотрите на этот код:с ++ сравнение двух двойных значений не работает должным образом
#include <cmath>
#include <iostream>
using namespace std;
class Sphere
{
double r;
public:
double V() const { return (4/3) * 3.14 * pow(r,3); }
bool equal(const Sphere& s) const
{
cout << V() << " == " << s.V() << " : " << (V() == s.V());
return (V() == s.V());
}
explicit Sphere(double rr = 1): r(rr){}
};
main()
{
Sphere s(3);
s.equal(s);
}
Выход 84.78 == 84.78 : 0
что означает тот же метод не возвращает то же значение каждый раз, даже если все параметры являются статическими?
Но если я пишу 3.0
вместо 3.14
в определении V()
метода, как это:
double V() const { return (4/3) * 3.0 * pow(r,3); }
Затем выход: 84.78 == 84.78 : 1
Что здесь происходит? Мне нужен этот метод, для моей программы, который будет сравнивать объемы двух объектов, но это невозможно? Я так долго ударил головой, чтобы выяснить, в чем причина проблемы, и, к счастью, я ее нашел, но теперь я не понимаю, почему? Имеет ли он какое-то отношение к компилятору (GCC), или я пропустил что-то важное здесь?
вы просто не проверяете число с плавающей точкой для такого равенства. – yngccc
@yngum почему? как я должен? – tuks
Обычно это плохая идея для проверки значений с плавающей запятой для равенства, поскольку небольшие ошибки округления могут дать неожиданные результаты. Но, как вы говорите, это делает тот же расчет дважды с одним и тем же входом, поэтому тест должен пройти. Он имеет как минимум одну версию GCC: http://ideone.com/FPjRVN. Какую версию и платформу вы используете? –