Pahan На мой взгляд тебе нужно прочитать учебник по вычислительной математике. А если коротко, то для числа A типа double можешь считать что абсолютная погрешность равна abs(A)*2^-52. Для суммы или разности абсолютная погрешность равна сумме погрешностей операндов. Для произведения или частного относительная погрешность равна сумме относительных погрешностей операндов. А относительную погрешность можно найти как отношение абсолютной погрешности к абсолютному значению операнда. А условие из первого сообщения, если считать что все три числа точные, а не результаты других вычислений, можно записать так: if (abs((a-b)-c)<abs(a)*2^-52+abs(b)*2^-52+abs(c)*2^-52) cout<<"yes" <<endl;
http://democoder.ru/article/14?SID=76c64ac959d4f421b58afc0ac4456fd3 Код (Text): if (fabs(x - y) < eps * fabs(max(x,y))) ну или еще вариант: Код (Text): if (fabs((x - y) / x) < eps)
Booster Да я вообще-то когда это читал. Но вот что это значит на практике только сейчас начал осознавать. Благодаря Вам. Спасибо. n0name Ссылка битая какая-то. А посмотреть хотелось бы.
Можно очень быстро вычислить eps. Интерпретировать результат как целое, записать в мантиссу 1 и снова интерпретировать как вещественное.
Pahan Можно также рассмотреть _относительную_ "esp": delta_abs=abs(x-y); if ( (delta_abs/x < eps) && (delta_abs/y < eps) ) - ну или как-то так. Конечно, для быстрых вычислений такое не годицца. Можно относительно быстро сравнить экспоненты или сравнивать x/y с 1...
1) Прекрасно все открывается. 2) Столько говорильни в пустую. Нужно строить алгоритм так, чтобы не нужно было сравнивать или надеятся на точное совпадение. Если нужно позарез - есть арифметика рациональных чисел : в ней все точно и нет проблем с эпсилон. Естественно в ней есть ограничения и по величине и по точности представления. Если нужно супер - берете bignum и на ее основе делаете bigrational.