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