Можно ли сравнивать числа с плавающей запятой с 0.0 без эпсилона?

Мне известно, что для сравнения двух значений с плавающей запятой необходимо использовать некоторую эпсилон-точность, поскольку они не точны. Однако мне интересно, есть ли крайние случаи, когда мне не нужен этот эпсилон.

В частности, я хотел бы знать, всегда ли безопасно делать что-то вроде этого:

double foo(double x){
    if (x < 0.0) return 0.0;
    else return somethingelse(x); // somethingelse(x) != 0.0
}

int main(){
   int x = -3.0;
   if (foo(x) == 0.0) { 
     std::cout << "^- is this comparison ok?" << std::endl; 
   }
}

Я знаю, что есть лучшие способы написатьfoo (например, возвращение флага дополнительно), но мне интересно, если в целом это нормально назначить0.0 к переменной с плавающей точкой, а затем сравнить ее с0.0.

Или, в более общем смысле, всегда ли следующее сравнение дает истину?

double x = 3.3;
double y = 3.3;
if (x == y) { std::cout << "is an epsilon required here?" << std::endl; }

Когда я попробовал, это, кажется, сработало, но, возможно, на это не стоит полагаться.

Ответы на вопрос(4)

Ваш ответ на вопрос