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

时间:2013-07-11 08:19:42

标签: c++ c floating-point undefined-behavior numeric-limits

我说了两件事:

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

  2. std::numeric_limits<float>::max()+(a large number喜欢:std::numeric_limits<float>::max()/3) 提供 inf。

  3. 为什么会出现这种差异? 1或2会导致OVERFLOW导致未定义的行为吗?

    编辑:测试此代码的代码:

    1

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

    2

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

2 个答案:

答案 0 :(得分:11)

形式上,行为未定义。在具有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,但今天不常见。)

答案 1 :(得分:1)

这取决于你在做什么。如果浮点数“溢出”出现在直接返回的表达式中,即

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

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

  

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

有关详细信息,请参阅here