Как правильно сравнивать числа типа double?
От: XJess  
Дата: 01.10.10 19:29
Оценка:
Привет всем!
Собственно, сабж. Интересуют ==, <, >. Я вроде бы знаю, что на равенство — это что-то типа fabs(var1 — var2) < std::numeric_limits<double>::epsilon(), а остальные как сравнивать?
Re: Как правильно сравнивать числа типа double?
От: OdesitVadim Украина  
Дата: 01.10.10 20:15
Оценка:
Здравствуйте, 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";


хотя может и так
Re: Как правильно сравнивать числа типа double?
От: dilmah США  
Дата: 01.10.10 20:41
Оценка: 3 (3) +3
XJ>Я вроде бы знаю, что на равенство — это что-то типа fabs(var1 — var2) < std::numeric_limits<double>::epsilon()

неправильно знаешь. Так имеет смысл сравнивать только числа порядка единицы.
Re: Как правильно сравнивать числа типа double?
От: kl Германия http://stardog.com
Дата: 01.10.10 20:57
Оценка: 45 (5) +1
Здравствуйте, XJess, Вы писали:

XJ>Привет всем!

XJ>Собственно, сабж. Интересуют ==, <, >. Я вроде бы знаю, что на равенство — это что-то типа fabs(var1 — var2) < std::numeric_limits<double>::epsilon(), а остальные как сравнивать?

Про сравнение double
Автор: McSeem2
Дата: 31.08.07
no fate but what we make
Re[2]: Как правильно сравнивать числа типа double?
От: _FRED_ Черногория
Дата: 01.10.10 21:11
Оценка:
Здравствуйте, kl, Вы писали:

XJ>>Собственно, сабж. Интересуют ==, <, >. Я вроде бы знаю, что на равенство — это что-то типа fabs(var1 — var2) < std::numeric_limits<double>::epsilon(), а остальные как сравнивать?


kl>Про сравнение double
Автор: McSeem2
Дата: 31.08.07


Спасибо, давно эту ссылку искал, найти всё никак не мог
Help will always be given at Hogwarts to those who ask for it.
Re: Как правильно сравнивать числа типа double?
От: TimurSPB Интернет  
Дата: 01.10.10 21:17
Оценка:
Здравствуйте, XJess, Вы писали:

XJ>Привет всем!

XJ>Собственно, сабж. Интересуют ==, <, >. Я вроде бы знаю, что на равенство — это что-то типа fabs(var1 — var2) < std::numeric_limits<double>::epsilon(), а остальные как сравнивать?

Это вопрос очень личный. В одном алгоритме 0.1 и 0 одно и то же, а в другом и std::numeric_limits<double>::epsilon() прокатит. Сколько задач, столько и эпсилонов.
Make flame.politics Great Again!
Re: Как правильно сравнивать числа типа double?
От: dilmah США  
Дата: 01.10.10 21:20
Оценка: 8 (1)
классический текст гуглится по словам Goldberg what every computer scientist should know about floating-point arithmetic
Re: Как правильно сравнивать числа типа double?
От: c-smile Канада http://terrainformatica.com
Дата: 01.10.10 21:57
Оценка: 8 (1)
Здравствуйте, XJess, Вы писали:

XJ>Привет всем!

XJ>Собственно, сабж. Интересуют ==, <, >. Я вроде бы знаю, что на равенство — это что-то типа fabs(var1 — var2) < std::numeric_limits<double>::epsilon(), а остальные как сравнивать?

<, > — как есть

А вот про ==, =<, => читать можно здесь:
http://www.cygnus-software.com/papers/comparingfloats/comparingfloats.htm
Re[3]: Как правильно сравнивать числа типа double?
От: Vain Россия google.ru
Дата: 02.10.10 01:56
Оценка:
Здравствуйте, _FRED_, Вы писали:

XJ>>>Собственно, сабж. Интересуют ==, <, >. Я вроде бы знаю, что на равенство — это что-то типа fabs(var1 — var2) < std::numeric_limits<double>::epsilon(), а остальные как сравнивать?

kl>>Про сравнение double
Автор: McSeem2
Дата: 31.08.07

_FR>Спасибо, давно эту ссылку искал, найти всё никак не мог
Только осторожней с той формулой, она работает только для чисел одинаковым знаком.
[In theory there is no difference between theory and practice. In
practice there is.]
[Даю очевидные ответы на риторические вопросы]
Re: Как правильно сравнивать числа типа double?
От: minorlogic Украина  
Дата: 02.10.10 08:24
Оценка:
Здравствуйте, 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?
От: andy1618 Россия  
Дата: 02.10.10 20:10
Оценка: +1
Здравствуйте, Vain, Вы писали:

kl>>>Про сравнение double
Автор: McSeem2
Дата: 31.08.07

_FR>>Спасибо, давно эту ссылку искал, найти всё никак не мог
V>Только осторожней с той формулой, она работает только для чисел одинаковым знаком.

Речь про эту формулу?
if (fabs(a-b) <= DBL_EPSILON * fmax(fabs(a),fabs(b)))
{
  . . .Числа равны с относительной точностью DBL_EPSILON
}


ИМХО тут всё чётко.
Re: Как правильно сравнивать числа типа double?
От: dilmah США  
Дата: 02.10.10 20:30
Оценка:
вообще в операциях с флоатами нужно придерживаться принципа примата комбинаторной структуры.
Что это значит. В программе обычно есть некие дискретные данные -- скажем, слева или справа лежит одна кривая относительно другой, или количество оборотов кривой вокруг чего-то. Эти данные и называю комбинаторной структурой. И самым важным должно быть поддержание этой структуры в непротиворечивом виде. Если слепо полагаться на вычисления с флоатами, то даже если сравнивать их правильно все равно можно прийти к ситуации когда комбинаторная структура становится противоречивой (из-за ошибок округления).
Re[5]: Как правильно сравнивать числа типа double?
От: Vain Россия google.ru
Дата: 03.10.10 14:11
Оценка: -1 :))
Здравствуйте, andy1618, Вы писали:

kl>>>>Про сравнение double
Автор: McSeem2
Дата: 31.08.07

_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 Россия  
Дата: 03.10.10 16:38
Оценка: +2
Здравствуйте, Vain, Вы писали:

V>>>Только осторожней с той формулой, она работает только для чисел одинаковым знаком.

A>>Речь про эту формулу?
A>>
A>>if (fabs(a-b) <= DBL_EPSILON * fmax(fabs(a),fabs(b)))
A>>{
A>>  . . .Числа равны с относительной точностью DBL_EPSILON
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.

Всё правильно — и должно быть false. Это как сравнивать +1 и -1 — было бы странно их уравнять
Re[7]: Как правильно сравнивать числа типа double?
От: Vain Россия google.ru
Дата: 03.10.10 19:54
Оценка:
Здравствуйте, andy1618, Вы писали:

V>>>>Только осторожней с той формулой, она работает только для чисел одинаковым знаком.

A>>>Речь про эту формулу?
A>>>
A>>>if (fabs(a-b) <= DBL_EPSILON * fmax(fabs(a),fabs(b)))
A>>>{
A>>>  . . .Числа равны с относительной точностью DBL_EPSILON
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?
От: dilmah США  
Дата: 03.10.10 20:03
Оценка: +1
A>>Всё правильно — и должно быть false. Это как сравнивать +1 и -1 — было бы странно их уравнять
V>С чего бы это, а почему 100000..00001 и 100000..00003 — не странно?

просто если это кажется странным, то значит флоаты были использованы не на своем месте, нужно было фиксированную точку использовать.
Re[9]: Как правильно сравнивать числа типа double?
От: Vain Россия google.ru
Дата: 03.10.10 22:27
Оценка:
Здравствуйте, 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?
От: dilmah США  
Дата: 03.10.10 22:32
Оценка:
V>Фиксированная точка не поможет, если формула не правильная.

какая формула?
Re[11]: Как правильно сравнивать числа типа double?
От: Vain Россия google.ru
Дата: 03.10.10 23:20
Оценка:
Здравствуйте, dilmah, Вы писали:

V>>Фиксированная точка не поможет, если формула не правильная.

D>какая формула?
Условие на равенство.
[In theory there is no difference between theory and practice. In
practice there is.]
[Даю очевидные ответы на риторические вопросы]
Re[12]: Как правильно сравнивать числа типа double?
От: dilmah США  
Дата: 04.10.10 04:41
Оценка: +1
V>>>Фиксированная точка не поможет, если формула не правильная.
D>>какая формула?
V>Условие на равенство.

а, ну так не нужно использовать для фиксированной точки формулу для плавающей точки
это же главное отличие: у плавающей точки плавающий эпсилон (зависящий от масштаба). У фиксированной точки фиксированный эпсилон.
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.