转换 double 和 float 类型是否保留无穷大和 NaN?

23

将双精度无穷大转换为单精度,反之亦然,结果仍是无穷大吗?NaN的情况是否相同?


2
在 C/C++ 中,将 float 类型的值传输到 double 类型时,它将被自动转换为 double 类型,并扩展为双精度浮点数。因此,即使在传输过程中保留了原始值,也会增加额外的精度位,从而可能导致四舍五入误差。 - NathanOliver
6
严格来说,这只涵盖了此处提出问题的一半。在IEEE754标准中,64位NaN比32位NaN多得多,因此从32位或64位开始是有影响的。链接的问题假设您从32位开始;而这个问题还考虑了您从64位NaN之一开始的情况。由于64位NaN超过40亿个,鸽巢原理告诉我们无法保留NaN的有效负载(即精确的二进制NaN表示)。 - MSalters
1个回答

27

任何浮点数转换为双精度型可以保留其值。如果原始值可以表示为浮点数,则将双精度型转换为浮点数可以保留其值。

如果您的系统符合IEEE-754标准,那么浮点数能够表示无穷大和NaN。否则,您可以使用<numeric_limits>来检查是否符合该标准。双精度型NaN的有效负载未必可用浮点数NaN来表示。


8
可能不支持NaN有效载荷,因为在IEEE-754中这是一个可选功能(应该提供而非必须提供)。例如,在GPU上运行CUDA时,双精度硬件支持NaN有效载荷,而单精度硬件产生一个单一的标准NaN(0x7fffffff)。但在doublefloat转换中,NaN保持NaN。 - njuffa

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接