我说了两件事:
std::numeric_limits<float>::max()+(a small number)
给出: std::numeric_limits<float>::max()
。
std::numeric_limits<float>::max()+(a large number
喜欢:std::numeric_limits<float>::max()/3)
提供 inf。
为什么会出现这种差异? 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;
答案 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。