Привет всем!
Собственно, сабж. Интересуют ==, <, >. Я вроде бы знаю, что на равенство — это что-то типа fabs(var1 — var2) < std::numeric_limits<double>::epsilon(), а остальные как сравнивать?
Здравствуйте, XJess, Вы писали:
XJ>Привет всем! XJ>Собственно, сабж. Интересуют ==, <, >. Я вроде бы знаю, что на равенство — это что-то типа fabs(var1 — var2) < std::numeric_limits<double>::epsilon(), а остальные как сравнивать?
думаю, по аналогии
float com = var1 - var2;
if (fabs(com) < std::numeric_limits<double>::epsilon())
cout << "eqv";
else if (com > 0) <<cout "first bigger";
else cout << "second";
Здравствуйте, XJess, Вы писали:
XJ>Привет всем! XJ>Собственно, сабж. Интересуют ==, <, >. Я вроде бы знаю, что на равенство — это что-то типа fabs(var1 — var2) < std::numeric_limits<double>::epsilon(), а остальные как сравнивать?
Здравствуйте, kl, Вы писали:
XJ>>Собственно, сабж. Интересуют ==, <, >. Я вроде бы знаю, что на равенство — это что-то типа fabs(var1 — var2) < std::numeric_limits<double>::epsilon(), а остальные как сравнивать?
kl>Про сравнение double
Здравствуйте, XJess, Вы писали:
XJ>Привет всем! XJ>Собственно, сабж. Интересуют ==, <, >. Я вроде бы знаю, что на равенство — это что-то типа fabs(var1 — var2) < std::numeric_limits<double>::epsilon(), а остальные как сравнивать?
Это вопрос очень личный. В одном алгоритме 0.1 и 0 одно и то же, а в другом и std::numeric_limits<double>::epsilon() прокатит. Сколько задач, столько и эпсилонов.
Здравствуйте, XJess, Вы писали:
XJ>Привет всем! XJ>Собственно, сабж. Интересуют ==, <, >. Я вроде бы знаю, что на равенство — это что-то типа fabs(var1 — var2) < std::numeric_limits<double>::epsilon(), а остальные как сравнивать?
Здравствуйте, _FRED_, Вы писали:
XJ>>>Собственно, сабж. Интересуют ==, <, >. Я вроде бы знаю, что на равенство — это что-то типа fabs(var1 — var2) < std::numeric_limits<double>::epsilon(), а остальные как сравнивать? kl>>Про сравнение double
Здравствуйте, XJess, Вы писали:
XJ>Привет всем! XJ>Собственно, сабж. Интересуют ==, <, >. Я вроде бы знаю, что на равенство — это что-то типа fabs(var1 — var2) < std::numeric_limits<double>::epsilon(), а остальные как сравнивать?
Общего ответа нет , каждый случай необходимо рассматривать по конкретной прикладной задаче. Т.е. каждый раз надо отвечать на вопрос , "какую информацию мы хотим извлечь сравнивая даблы"
Например:
1. Инвертирую матрицу и потом умножая на исходную, можно ожидать от метода максимальной точности в пределах машинной погрешности (или извесной погрешности метода).
2. сравнивая таймстампы (временные метки) ряда записей , может необходимо найти просто БЛИЖАЙШИЙ таймстамп к заданному а не точно совпадающий и тут сравнение с любым эпсилоном будет некоректно.
3. А есть алгоритмы где можно сравнивать даблы с помощью "==" потому что они получены из одного источника.
... << RSDN@Home 1.2.0 alpha 4 rev. 1237>>
Ищу работу, 3D, SLAM, computer graphics/vision.
Re[4]: Как правильно сравнивать числа типа double?
вообще в операциях с флоатами нужно придерживаться принципа примата комбинаторной структуры.
Что это значит. В программе обычно есть некие дискретные данные -- скажем, слева или справа лежит одна кривая относительно другой, или количество оборотов кривой вокруг чего-то. Эти данные и называю комбинаторной структурой. И самым важным должно быть поддержание этой структуры в непротиворечивом виде. Если слепо полагаться на вычисления с флоатами, то даже если сравнивать их правильно все равно можно прийти к ситуации когда комбинаторная структура становится противоречивой (из-за ошибок округления).
Re[5]: Как правильно сравнивать числа типа double?
_FR>>>Спасибо, давно эту ссылку искал, найти всё никак не мог V>>Только осторожней с той формулой, она работает только для чисел одинаковым знаком. A>Речь про эту формулу? A>
A>if (fabs(a-b) <= DBL_EPSILON * fmax(fabs(a),fabs(b)))
A>{
A> . . .Числа равны с относительной точностью DBL_EPSILON
A>}
A>
A>ИМХО тут всё чётко.
Ну подставте, к примеру, 1.e-10 и -1.e-10, получится:
if (2.e-10 <= 2.e-16 * 1.e-10)
Очевидно что false. Это, имхо, потому-что двух чисел с разным знаком — недостаточно для их сравнения, не хватает данных. И если подумать, то с одним знаком — тоже, т.к., по большому счёту, чтобы сравнить два числа нужно — третье, независимое число.
[In theory there is no difference between theory and practice. In
practice there is.]
[Даю очевидные ответы на риторические вопросы]
Re[6]: Как правильно сравнивать числа типа double?
Здравствуйте, andy1618, Вы писали:
V>>>>Только осторожней с той формулой, она работает только для чисел одинаковым знаком. A>>>Речь про эту формулу? A>>>
A>>>ИМХО тут всё чётко. V>>Ну подставте, к примеру, 1.e-10 и -1.e-10, получится: V>>
V>>if (2.e-10 <= 2.e-16 * 1.e-10)
V>>
V>>Очевидно что false. A>Всё правильно — и должно быть false. Это как сравнивать +1 и -1 — было бы странно их уравнять
С чего бы это, а почему 100000..00001 и 100000..00003 — не странно?
[In theory there is no difference between theory and practice. In
practice there is.]
[Даю очевидные ответы на риторические вопросы]
Re[8]: Как правильно сравнивать числа типа double?
A>>Всё правильно — и должно быть false. Это как сравнивать +1 и -1 — было бы странно их уравнять V>С чего бы это, а почему 100000..00001 и 100000..00003 — не странно?
просто если это кажется странным, то значит флоаты были использованы не на своем месте, нужно было фиксированную точку использовать.
Re[9]: Как правильно сравнивать числа типа double?
Здравствуйте, dilmah, Вы писали:
A>>>Всё правильно — и должно быть false. Это как сравнивать +1 и -1 — было бы странно их уравнять V>>С чего бы это, а почему 100000..00001 и 100000..00003 — не странно? D>просто если это кажется странным, то значит флоаты были использованы не на своем месте, нужно было фиксированную точку использовать.
Фиксированная точка не поможет, если формула не правильная.
[In theory there is no difference between theory and practice. In
practice there is.]
[Даю очевидные ответы на риторические вопросы]
Re[10]: Как правильно сравнивать числа типа double?
V>>>Фиксированная точка не поможет, если формула не правильная. D>>какая формула? V>Условие на равенство.
а, ну так не нужно использовать для фиксированной точки формулу для плавающей точки
это же главное отличие: у плавающей точки плавающий эпсилон (зависящий от масштаба). У фиксированной точки фиксированный эпсилон.