转换为双精度浮点数或浮点数是不是保留无穷大和 NaN?
Posted
技术标签:
【中文标题】转换为双精度浮点数或浮点数是不是保留无穷大和 NaN?【英文标题】:Does casting to or from a double and a float preserve infinity and NaN?转换为双精度浮点数或浮点数是否保留无穷大和 NaN? 【发布时间】:2021-07-02 06:23:47 【问题描述】:当将双无穷大转换为浮点数时,反之亦然,它仍然是无穷大吗?和 NaN 一样吗?
【问题讨论】:
相关/欺骗:***.com/questions/14773142/… @NathanOliver:严格来说,这仅涵盖了这里询问的一半情况。在 IEEE754 中,64 位 NaN 的数量比 32 位 NaN 的数量多,因此从 32 位还是 64 位开始很重要。链接的问题假设您从 32 位开始;这个问题还考虑了从 64 位 NaN 之一开始的情况。并且由于有超过 40 亿个 64 位 NaN,鸽巢原理告诉我们不能保留 NaN payload(精确的二进制 NaN 表示) 【参考方案1】:将 any float 转换为 double 可以保证保留该值。如果原始值可以表示为浮点数,则可以保证将双精度数转换为浮点数。
如果您的系统符合 IEEE-754,则 float 可以表示无穷大和 NaN。否则,您可以使用<numeric_limits>
来检查是否是这种情况。双 NaN 的有效负载不一定可以用浮点 NaN 表示。
【讨论】:
可能不支持 NaN 有效负载,因为这是 IEEE-754 中的 可选 功能(应该提供,而不是应提供)。例如,在 GPU 上运行 CUDA 时,双精度硬件支持 NaN 有效负载,而单精度硬件产生单个规范 NaN (0x7fffffff
)。但在 double
到 float
的转换中,NaN 保持为 NaN。以上是关于转换为双精度浮点数或浮点数是不是保留无穷大和 NaN?的主要内容,如果未能解决你的问题,请参考以下文章
比较一个 32 位浮点数和一个 32 位整数而不强制转换为双精度,当任何一个值都可能太大而无法完全适合另一种类型时
C语言atof()函数:将字符串转换为double(双精度浮点数)