向下转换为浮动:保证溢出行为?

时间:2013-07-19 16:26:17

标签: c++ casting floating-point

如果我试试这个

float f = (float)numeric_limits<double>::infinity();

或者实际上,尝试将大于浮动最大值的任何东西投射到浮点数上,我保证最终会得到无穷大吗?

它适用于GCC,但它是一个标准吗?

2 个答案:

答案 0 :(得分:8)

  

float f = (float)numeric_limits<double>::infinity();

如果您的编译平台为浮点计算提供IEEE 754算法(通常是这样),则可以保证将f设置为无穷大。

  

或者实际上,尝试将大于浮动最大值的任何东西投射到浮点数上,我保证最终会得到无穷大吗?

没有。在默认的IEEE 754舍入到最近模式中,高于最大有限double(即float)的几个FLT_MAX值会转换为FLT_MAX。精确限制是FLT_MAX(C99十六进制表示中为0x1.fffffep127)与下一个float数字之间的数字,如果单精度格式中的指数具有更大范围,则可以表示该数字,0x2.0p127。因此,限制为0x1.ffffffp127或约为3.4028235677973366e + 38。(

答案 1 :(得分:6)

来自C ++ 11标准,§4.8.1:

  

浮点类型的prvalue可以转换为prvalue   另一种浮点类型。如果源值可以准确   在目标类型中表示,转换的结果是   确切的表示。如果源值在两个相邻之间   目的地值,转换的结果是   实现定义的这两个值的选择。除此以外,   行为未定义。

这意味着

  • 如果你将双无穷大投射浮动,你会浮动无穷大。

  • 如果你施加一个double值,它位于float max和infinity之间,浮动,那么你得到float max或float infinity。