Здравствуйте. Столкнулся на практике с такой ситуацией double a=0.31; double b=0.29; double c=0.02; if ((a-b)==c) cout<<"yes" <<endl; К моему удивлению, условие в скобках не выполняется. Подозреваю, что a-b=0.020000000000000453 и из-за этой погрешности результат сравнения - ЛОЖЬ, Буду благодарен, если кто-нибудь поделится своими мыслями относительно данной ситуации и способами,как можно добится результата ИСТИНА при подобном сравнении. Спасибо.
Код (Text): if (x == y) заменять на Код (Text): static const double eps = 0.00000001; if (x - y < eps)
Это вопрос был. Цифры наобум абсолютно. Ну должна же быть эта погрешность разумной. А вообще вот что нашел в инете еще по этому поводу, на одном из форумов: Код (Text): Просто числа хранятся в двоичном виде, по этому число 1.2 = 1 + 1/5 точно представить невозможно, можно только приближенно. Например в double точность мантиссы 52 бит, т.е. погрешность будет где-то +- 0.5 * 1/(2^52) ~ 1.110223e-16
Pahan Погнешность определяется разрядами, а не числом. Для разных чисел своя погрешность. Если взять большое или малое число, то ваше eps можно спускать в унитаз.
Равенство вещественных числ нельзя проверять из-за погрешности. Только "больше/меньше". Н-р, 0,6 по-моему в двоичном виде - бесконечная дробь.
AndreyMust19 >Равенство вещественных числ нельзя проверять из-за погрешности. Много чего нельзя, но нужно.
Booster Какой тогда выход?? Пусть погрешность определяется разрядом. Но тогда разве нельзявзять eps=10^-6 и использовать Код (Text): (fabs(x - y) < eps) считая это погрешностью в шестом разряде и для больших и для малых чисел?
Pahan Если тебе так уж хочется сравнивать числа на равенство, то можешь создать свой класс Число_с_погрешностью, определить для него все нужные тебе операции, которые кроме самого числа будут еще вычислять и его погрешность.
Если не сложно, объясните для тупых пожалуйста - почему нельзя взять некоторую универсально маленькую eps и использовать при всех операциях сравнения на равенство для переменных double?
Pahan Потому что с каждой математической операцией с double погрешность накапливается и eps надо увеличивать. Black_mirror Не мешало бы поставить счетчик при проведении каждой матоперации, чтобы увеличивать eps на разрядность мантиссы.
Pahan Погрешность это минимальное число в мантиссе. Но так как есть ещё порядок, то погрешность может иметь большой диапазон значений.