Моя функция, чтобы избавиться от дробной части двух дублей при сохранении их соотношения:Как преодолеть неточность двойной точности?
void enlarge(double &a, double &b)
{
while (a != trunc(a) || b != trunc(b))
{
a *= 10;
b *= 10;
//output added for debugging
cout << "a = " << a << ", b = " << b << endl;
cout << "trunc(a) = " << trunc(a) << ", trunc(b) = " << trunc(b) << endl;
cout << "a == trunc(a): " << to_string(a == trunc(a)) << ", b == trunc(b): " << to_string(b == trunc(b)) << endl;
//to see output step by step
string asd;
cin >> asd;
}
}
выход, когда он перестает работать правильно:
a = 0.876, b = 99.9
trunc(a) = 0, trunc(b) = 99
a == trunc(a): 0, b == trunc(b): 0
a
a = 8.76, b = 999
trunc(a) = 8, trunc(b) = 999
a == trunc(a): 0, b == trunc(b): 1
a
a = 87.6, b = 9990
trunc(a) = 87, trunc(b) = 9990
a == trunc(a): 0, b == trunc(b): 1
a
a = 876, b = 99900
trunc(a) = 876, trunc(b) = 99900 //This is where it stops working
a == trunc(a): 0, b == trunc(b): 1 //Notice how 876 != 876
a
a = 8760, b = 999000
trunc(a) = 8760, trunc(b) = 999000
a == trunc(a): 0, b == trunc(b): 1
Что мне делать в этой ситуации?
A) Его довольно сложно найти ошибки в коде, которые вы не показываете. B) std :: cout не печатает числа до полной точности. Здесь есть несколько вопросов по этой теме. Просто найдите его. Если вам нужен формат вывода, я бы использовал printf. C) Чтобы ответить на ваш вопрос: используйте более точный тип номера. – user463035818
Взгляните на это: http://stackoverflow.com/questions/10334688/how-dangerous-is-it-to-compare-floating-point-values – NathanOliver
Считаете ли вы использование * фиксированной точки * математики? Вы можете получить лучшую точность. –