float加多了会不会导致'floating point invalid operation'?
Can too many additions of floats cause 'floating point invalid operation'?
鉴于数字比较小(~-1 到~1),而且是随机生成的浮点数,你能不能把它们加得太多得到'floating point invalid operation'?我问是因为这显然是我现在的程序中发生的事情,而且很少发生。另外,如何禁用(或避免)此异常?
以防万一,我的编译器是gcc (i686-posix-dwarf-rev0, Built by MinGW-W64 project) 5.1.0.
编辑根据要求我提供了代码。但是,添加浮点数导致错误只是我的猜测,这就是我来这里的原因,看看这是否可能是我的问题。如果我 运行 下面的代码,我能得到错误是否合理?
#include <iostream>
int main()
{
float sum = 0, add = 0;
while (true)
{
add = static_cast <float> (rand()) / static_cast <float> (RAND_MAX);
if (rand() % 2) add *= -1;
sum += add;
}
}
编辑 2:我没有收到上面代码的错误,我只需要知道它是否会发生。
IEEE 754标准定义了以下几种情况下会发生“无效操作”浮点异常:
- 在信令 NaN 上运行
- 乘以0×∞或∞×0
- adding/subtracting∞−∞,−∞+∞等无穷大
- 除以 0/0 或 ∞/∞
- 计算 x/y 的余数,当 y=0 或 x=∞ 且两者都不是 NaN
- 负数的平方根
- 当结果不符合目标格式或当一个操作数是有限的而另一个是无限的时量化
- 将 NaN、∞ 或超出目标范围的浮点数转换为整数
- 比较无序浮点值与信号
- 计算NaN、∞或0的整数对数
您的示例代码不会触发任何这些情况,因此问题可能出现在您代码的其他地方。
鉴于数字比较小(~-1 到~1),而且是随机生成的浮点数,你能不能把它们加得太多得到'floating point invalid operation'?我问是因为这显然是我现在的程序中发生的事情,而且很少发生。另外,如何禁用(或避免)此异常?
以防万一,我的编译器是gcc (i686-posix-dwarf-rev0, Built by MinGW-W64 project) 5.1.0.
编辑根据要求我提供了代码。但是,添加浮点数导致错误只是我的猜测,这就是我来这里的原因,看看这是否可能是我的问题。如果我 运行 下面的代码,我能得到错误是否合理?
#include <iostream>
int main()
{
float sum = 0, add = 0;
while (true)
{
add = static_cast <float> (rand()) / static_cast <float> (RAND_MAX);
if (rand() % 2) add *= -1;
sum += add;
}
}
编辑 2:我没有收到上面代码的错误,我只需要知道它是否会发生。
IEEE 754标准定义了以下几种情况下会发生“无效操作”浮点异常:
- 在信令 NaN 上运行
- 乘以0×∞或∞×0
- adding/subtracting∞−∞,−∞+∞等无穷大
- 除以 0/0 或 ∞/∞
- 计算 x/y 的余数,当 y=0 或 x=∞ 且两者都不是 NaN
- 负数的平方根
- 当结果不符合目标格式或当一个操作数是有限的而另一个是无限的时量化
- 将 NaN、∞ 或超出目标范围的浮点数转换为整数
- 比较无序浮点值与信号
- 计算NaN、∞或0的整数对数
您的示例代码不会触发任何这些情况,因此问题可能出现在您代码的其他地方。