如果我试试这个
float f = (float)numeric_limits<double>::infinity();
或者实际上,尝试将任何大于 float max 的东西转换为 float,我能保证最终得到无穷大吗?
它适用于 GCC,但它是标准吗?
如果我试试这个
float f = (float)numeric_limits<double>::infinity();
或者实际上,尝试将任何大于 float max 的东西转换为 float,我能保证最终得到无穷大吗?
它适用于 GCC,但它是标准吗?
float f = (float)numeric_limits<double>::infinity();
f
如果您的编译平台为浮点计算提供 IEEE 754 算法(通常是这样),则可以保证将其设置为无穷大。
或者实际上,尝试将任何大于 float max 的东西转换为 float,我能保证最终得到无穷大吗?
否。在默认的 IEEE 754 舍入到最近模式中,double
高于最大有限float
(即FLT_MAX
)的几个值转换为FLT_MAX
。FLT_MAX
确切的限制是(0x1.fffffep127
在 C99 十六进制表示中)和下一个数字之间的中间float
数字,如果单精度格式的指数具有更大的范围,则可以表示0x2.0p127
。因此,十进制限制为0x1.ffffffp127
或大约为 3.4028235677973366e+38。
根据 C++11 标准,§4.8.1:
浮点类型的纯右值可以转换为另一种浮点类型的纯右值。如果源值可以在目标类型中精确表示,则转换的结果就是该精确表示。如果源值介于两个相邻的目标值之间,则转换的结果是实现定义的对这些值中的任何一个的选择。否则,行为未定义。
这意味着
如果将双无穷大转换为浮点数,则会得到浮点无穷大。
如果你将一个介于 float max 和 infinity 之间的 double 值转换为 float,那么你会得到 float max 或 float infinity。