当浮点变量超出浮动限制时,会发生什么?
我说了两件事:
-
std::numeric_limits::max()+(a small number)
给出:std::numeric_limits::max()
。 -
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的重叠限制不适用于函数返回的情况。 浮点值的表示可以具有比类型所暗示的更宽的范围或精度; 可以使用演员来消除这种额外的范围和精度。
有关详细信息,请参见此处