缩小从double到float的转换:保证溢出行为
Narrowing conversion from double to float: is overflow behaviour guaranteed?
如果我尝试这个
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。
相关文章:
- 获取隐式转换溢出从无符号到已签名的警告
- 将公共递归转换为尾递归,因为大型输入的堆栈溢出
- 将字符数组转换为结构时出现问题. 结构的字符数组变量溢出
- 从双精度转换为整数的显式类型是否始终检查整数溢出?
- 将字符串转换为整数类型T,检查是否存在溢出
- 将整型转换为浮点型时检测溢出
- 隐式转换双重到无符号长溢出 c++
- 如何检查溢出将字符*[]转换为无符号短短
- 如何在预处理器 (#if) 中强制转换静态 const 以避免溢出
- 当我尝试将char*转换为C 中的双重溢出时,如何检查双重溢出
- 从指针进行特征3类型的强制转换/复制(溢出uint8_t)
- 将uint32_t转换为int32_t,既没有溢出的风险,也没有过度复杂的风险
- 从毫米到公里的转换(以较小的单位溢出,例如米)
- 64位溢出数学转换
- 在涉及溢出错误的情况下,从int转换为char
- 缩小从double到float的转换:保证溢出行为
- 不同的编译器用来处理数字转换中的溢出的常见策略是什么?
- 隐式常量转换中的溢出[-Woverflow]
- 长类型Max等于int Max error + math.h pow()编译警告:隐式常量转换溢出
- CPP:防止溢出的类型转换