非零浮点数的乘法能否恰好为零?
Can multiplication of non-zero floats yield exactly zero?
假设我有一系列 double
或 float
格式的小随机浮点数 ,它们保证不为零 ,在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.
的部分
假设我有一系列 double
或 float
格式的小随机浮点数 ,它们保证不为零 ,在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.