非零浮点数的乘法能否恰好为零?

Can multiplication of non-zero floats yield exactly zero?

假设我有一系列 doublefloat 格式的小随机浮点数 ,它们保证不为零 ,在a CPU 遵循 IEEE754 标准,我在这些小数字中的两个之间进行乘法运算。

如果两个数字都不为零但非常小(低于机器 epsilon),乘法结果是否有可能产生零或负零,这样如果我将结果解释为 C++ 布尔值,它会翻译进入 false?

是的。您可以通过实验证明这一点:

#include <stdio.h>

int main()
{
    float x = 0.1 ;
    int it = 0 ;
    
    while( x *= x )
    {
        it++ ;
        printf( "%d %f\n", it, x ) ;
    }

    return 0;
}

输出:

1 0.010000                                                                                                                                                                                    
2 0.000100                                                                                                                                                                                    
3 0.000000                                                                                                                                                                                    
4 0.000000                                                                                                                                                                                    
5 0.000000 

循环终止的事实表明 x 为零并隐式转换为 false

测试在 double 上运行了 8 次迭代,在 Linux 上运行了 12 次 long double

结果与 while( -(x *= x) ) 相同 - 解决您问题中涉及 negative-zero.

的部分