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