如果我试试这个
float f = (float)numeric_limits<double>::infinity();
或者实际上,尝试将大于浮动最大值的任何东西投射到浮点数上,我保证最终会得到无穷大吗?
它适用于GCC,但它是一个标准吗?
答案 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。