Можно ли сравнивать числа с плавающей запятой с 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; }
Когда я попробовал, это, кажется, сработало, но, возможно, на это не стоит полагаться.