向下转换为浮动:保证溢出行为?

Sid*_*Bob 10 c++ floating-point casting

如果我试试这个

float f = (float)numeric_limits<double>::infinity();
Run Code Online (Sandbox Code Playgroud)

或者实际上,尝试将比浮动最大值更大的东西投射到浮点数上,我保证最终得到无穷大?

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

Pas*_*uoq 8

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

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

或者实际上,尝试将比浮动最大值更大的东西投射到浮点数上,我保证最终得到无穷大?

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

  • 按照这个答案的说法,"少数"是5.36亿,87万,911. (3认同)
  • 我认为 Pascal 的意思是在 `0x1.fffffep127` 和 `0x1.00000p128` 之间。但我认为他不小心增加了尾数和指数。 (2认同)

Joh*_*åde 6

从C++ 11标准,§4.8.1:

浮点类型的prvalue可以转换为另一个浮点类型的prvalue.如果源值可以在目标类型中准确表示,则转换的结果就是精确表示.如果源值在两个相邻目标值之间,则转换结果是这些值中任一个的实现定义选择.否则,行为未定义.

这意味着

  • 如果你将双无穷大投射浮动,你会浮动无穷大.

  • 如果你抛出一个double值,它位于float max和infinity之间,浮动,那么你得到float max或float infinity.