C++ 下浇双浮:是否保证溢流性能?

C++ 下浇双浮:是否保证溢流性能?,c++,casting,floating-point,C++,Casting,Floating Point,如果我试试这个 float f = (float)numeric_limits<double>::infinity(); float f=(float)数值限制::无穷大(); 或者确实,试着把比float max更大的东西放到一个float中,我能保证最终得到无穷大吗 它适用于GCC,但它是标准吗?来自C++11标准§4.8.1: 浮点类型的prvalue可以转换为prvalue 另一种浮点类型。如果源值可以精确 在目标类型中表示,转换的结果为 这就是确切的表示。如果源值介于两

如果我试试这个

float f = (float)numeric_limits<double>::infinity();
float f=(float)数值限制::无穷大();
或者确实,试着把比float max更大的东西放到一个float中,我能保证最终得到无穷大吗


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

来自C++11标准§4.8.1:

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

这意味着

  • 如果你将双无限抛给float,你会得到float infinity

  • 如果将一个介于float max和infinity之间的双精度值转换为float,则得到float max或float infinity

float f=(float)数值限制::无穷大()

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

或者确实,试着把比float max更大的东西放到一个float中,我能保证最终得到无穷大吗


否。在默认的IEEE 754四舍五入至最近模式中,一些高于最大有限浮点值的
值(即
FLT_MAX
)转换为
FLT_MAX
。精确限值是介于
FLT_MAX
0x1.fffff ep127
以C99十六进制表示)和下一个
float
数字之间的中间数字,如果单精度格式的指数具有更大的范围,
0x2.0p127
。因此,限制是0x1。FFFFFF P127或大约3.4028235677973366e+38(十进制)。

问题的第一部分是关于无穷大的,它可以准确地表示在目标类型中,否?@Pascal Cuoq:我已经修改了答案。@user763305这是一个有趣的解释;我从未想过,但你是对的:大于
FLT_MAX
的值介于
FLT_MAX
Inf
之间,因此该行为由标准定义良好。(即使不是,当然,它是由IEEE定义的。)用IEEE 754算法(这是常见的)四舍五入到最近的模式。用这个答案的说法,“少数”是5.36亿,87万,911。我认为帕斯卡的意思是介于
0x1.fffff ep127
0x1.00000p128
之间。但我认为他意外地增加了尾数和指数。我的意思是,为了清晰起见,所有值都具有相同的指数(现在更改)。