我知道,要比较两个浮点数值,需要使用一些 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
进行比较是否可以。
更一般地说,以下比较是否总是为true?
double x = 3.3;
double y = 3.3;
if (x == y) { std::cout << "is an epsilon required here?" << std::endl; }
我尝试过,似乎可以工作,但不能依赖它。
0.0
是特殊的? - Oliver Charlesworth3.3
不等于3.3
呢?作为基于二进制的数字,其精确值可能不同,但肯定是以相同的方式不同。我认为这些应该是相等的。 - Johannes Schaub - litb