在 C 中初始化为零的浮点变量的相等性
Equality of a floating point variable initialised to zero in C
我了解由于值的存储方式,不应对浮点数执行相等运算,而应执行阈值比较。但是当值设置为常量值(比如 0)时使用相等是否安全?
void test() {
double max = 0.0;
do {
if (condition) {
if (max != 0.0) { // Is this safe
// myval is always a large positive number
max = min(myval, max);
} else {
max = myval;
}
}
} while (my_condition);
return myval;
}
我可以在 Whosebug 上看到几个类似的问题。但我的问题是特定于分配了常量零的变量(不是操作的结果)。
假设您使用的是 IEEE-754 二进制格式,是的,它是安全的,因为 0.0
可以在 IEEE-754 中准确表示。 +0
的二进制格式只有一种表示形式(-0
有一种表示形式,另请注意 +0 = -0
)。
0.0
在 IEEE-754 中有精确的表示,因此如果两个变量设置为 0.0
,则它们的比较结果应该始终为真。但是如果在你的代码中 max
真的总是 0.0
,你最好删除 if 块,因为它永远不会执行。
我了解由于值的存储方式,不应对浮点数执行相等运算,而应执行阈值比较。但是当值设置为常量值(比如 0)时使用相等是否安全?
void test() {
double max = 0.0;
do {
if (condition) {
if (max != 0.0) { // Is this safe
// myval is always a large positive number
max = min(myval, max);
} else {
max = myval;
}
}
} while (my_condition);
return myval;
}
我可以在 Whosebug 上看到几个类似的问题。但我的问题是特定于分配了常量零的变量(不是操作的结果)。
假设您使用的是 IEEE-754 二进制格式,是的,它是安全的,因为 0.0
可以在 IEEE-754 中准确表示。 +0
的二进制格式只有一种表示形式(-0
有一种表示形式,另请注意 +0 = -0
)。
0.0
在 IEEE-754 中有精确的表示,因此如果两个变量设置为 0.0
,则它们的比较结果应该始终为真。但是如果在你的代码中 max
真的总是 0.0
,你最好删除 if 块,因为它永远不会执行。