在 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.0IEEE-754 中有精确的表示,因此如果两个变量设置为 0.0,则它们的比较结果应该始终为真。但是如果在你的代码中 max 真的总是 0.0,你最好删除 if 块,因为它永远不会执行。