当浮点变量超出浮动限制时,会发生什么?

我说了两件事:

  1. std::numeric_limits::max()+(a small number) 给出: std::numeric_limits::max()

  2. std::numeric_limits::max()+(a large number如: std::numeric_limits::max()/3) 给出 inf。

为何如此差异? 1或2会导致OVERFLOW导致未定义的行为吗?

编辑:测试此代码:

1。

 float d = std::numeric_limits::max(); float q = d + 100; cout << "q: " << q << endl; 

2。

 float d = std::numeric_limits::max(); float q = d + (d/3); cout << "q: " << q << endl; 

forms上,行为是不确定的。 但是, 具有IEEE浮点的计算机上, 舍入后溢出将导致Inf 。 但是,精度是有限的, FLT_MAX + 1舍入后的结果是FLT_MAX

FLT_MAX下,您可以看到相同的效果。 尝试以下方法:

 float f1 = 1e20; // less than FLT_MAX float f2 = f1 + 1.0; if ( f1 == f2 ) ... 

if将评估为true ,至少使用IEEE算法。 (确实存在,或者至少已经存在的机器,其中float具有足够的精度以便if评估为false ,但它们在今天并不常见。)

这取决于你在做什么。 如果float“overflow”出现在一个直接返回的表达式中,即

 return std::numeric_limits::max() + std::numeric_limits::max(); 

该操作可能不会导致溢出。 我引用C标准[ISO / IEC 9899:2011]:

return语句不是赋值。 子条款6.5.16.1的重叠限制不适用于函数返回的情况。 浮点值的表示可以具有比类型所暗示的更宽的范围或精度; 可以使用演员来消除这种额外的范围和精度。

有关详细信息,请参见此处