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

1,00
р.
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 и пр.