11

如果我试试这个

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

或者实际上,尝试将任何大于 float max 的东西转换为 float,我能保证最终得到无穷大吗?

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

4

2 回答 2

10

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

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

或者实际上,尝试将任何大于 float max 的东西转换为 float,我能保证最终得到无穷大吗?

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

于 2013-07-19T16:32:41.007 回答
7

根据 C++11 标准,§4.8.1:

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

这意味着

  • 如果将双无穷大转换为浮点数,则会得到浮点无穷大。

  • 如果你将一个介于 float max 和 infinity 之间的 double 值转换为 float,那么你会得到 float max 或 float infinity。

于 2013-07-19T16:30:57.897 回答