缩小从double到float的转换:保证溢出行为

Narrowing conversion from double to float: is overflow behaviour guaranteed?

本文关键字:溢出 转换 double float 缩小      更新时间:2023-10-16

如果我尝试这个

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

或者,实际上,试着把任何大于float max的值降为float,我能保证以无穷大结束吗?

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

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

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

或者,实际上,试着把任何大于float max的值降为float,我能保证以无穷大结束吗?

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

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

浮点类型的prvalue可以转换为另一种浮点类型。如果源值可以精确以目标类型表示,转换的结果为确切的表述。如果源值介于两个相邻值之间目标值,转换的结果是实现定义了对这些值中任一值的选择。否则行为是未定义的。

这意味着

  • 如果你把二重无穷大投射到float,你得到float无穷大。

  • 如果你把一个介于float max和infinity之间的双值投射到float,那么你得到float max或float infinity。