Страницы

Поиск по вопросам

вторник, 2 октября 2018 г.

Безопасно ли сравнение == для типа double?

double d = -1;
if (d==-1) { }
При каких обстоятельствах, безопасность сравнения на == становится низкой? Надо переменную умножить, поделить или что, чтобы double начал показывать погрешность вроде не 0, а 0.00000001, и приходится применять эпсилон, а не простое сравнение. В настройках компилятора есть опция: Модель вычислений с плавающий точкой (точный, строгий, быстрый). На что она влияет, если установлено "быстрый", то double будет не точно работать?


Ответ

Отвечаю по-пунктам:
Нельзя сравнивать два числа с плавующей запятой между собой, из за того, что числа с плавующей запятой не могут быть представлены точно, по-этому мы не можем полагаться на оператор сравнения.
Популярная практика сравнения такая:
#include #include
bool is_equal(double x, double y) { return std::fabs(x - y) < std::numeric_limits::epsilon(); }
Можно задавать свой "эпсилон". Как я понял, речь идет о MS VC++. Опции компилятора описаны тут https://msdn.microsoft.com/ru-ru/library/e7s85ffb.aspx Если выбрать fast, то не будет соблюдаться стандарт IEEE 754. Не будут работать сравнения с Nan и пр.

Комментариев нет:

Отправить комментарий