【问题标题】:How are double-precision floating-point numbers converted to single-precision floating-point format?双精度浮点数如何转换为单精度浮点格式?
【发布时间】:2012-08-02 07:19:46
【问题描述】:

将数字从 double-precision floating-point format 转换为 single-precision floating-point format 会导致精度损失。实现这种转换的算法是什么?

大于3.4028234e+38 或小于-3.4028234e+38 的数字是否简单地减少到各自的限制?我觉得转换过程比这更复杂,但我找不到它的文档。

【问题讨论】:

    标签: floating-point type-conversion ieee-754 double-precision single-precision


    【解决方案1】:

    最常见的浮点格式是 IEEE 754 标准中指定的二进制浮点格式。我将回答您对这些格式的问题。新版(2008)标准中还有十进制浮点格式,也有 IEEE 754 标准以外的格式,但 754 二进制格式是迄今为止最常见的格式。 Wikipedia page 中有一些关于舍入的信息和标准链接。

    将双精度转换为单精度与对任何操作的结果进行舍入处理相同。 (例如,加法、乘法或平方根具有精确的数学值,并且该值根据规则四舍五入以产生运算返回的结果。为了转换,输入值是精确的数学值,并且它是四舍五入的。)

    一般来说,计算环境都有一些默认的舍入模式。 (各种编程语言可能会提供更改默认舍入模式的方法,或者专门针对每个操作指定它。)默认舍入模式通常是舍入到最近的。其他是向零舍入、向正无穷舍入(向上)和向负无穷舍入(向下)。

    在四舍五入模式下,返回最接近精确值的可表示数字。如果出现平局,则返回具有偶数低位(在其小数或有效数中)的数字。为此,无穷大实际上就像是有限数模式中的下一个值一样。在单精度中,最大的有限数是 0x1.fffff8p127、0x1.fffffap127、0x1.fffffcp127 和 0x1.ffffffep127。 (单精度有效数中有 24 位,因此该位中的步长是最后一个十六进制数字中的步长 2。)出于舍入目的,无穷大就像它在 0x2p128 处一样。因此,如果确切结果更接近 0x1.ffffffep127(因此,小于 0x1.ffffffp127),则将其四舍五入为 0x1.ffffffep127。如果大于等于 0x1.ffffffp127,则四舍五入为无穷大。负无穷大的情况是对称的。

    在向无穷大舍入模式下,返回大于或等于精确值的最接近的可表示值。因此,任何高于 0x1.ffffep127 的值都会四舍五入为无穷大。向负无穷大舍入返回小于或等于确切值的最接近的可表示值。向零舍入返回向零方向最接近的可表示值。

    IEEE 754 标准只规定了结果;它没有指定算法。用于实现舍入的方法取决于每个实现。

    【讨论】:

    • 关于十六进制格式的说明:0xp 表示将解释为十六进制数字(包括标记单位位置的点)并乘以2的结果提高到 的幂。这样可以很容易地看到浮点值的表示,并看到诸如 0x1.fffffep127 是最大的可表示有限值之类的事实,因为它的有效数字中的所有 24 位都打开并且它具有最大指数 127 .
    • 注解:是十进制数字。
    猜你喜欢
    • 2020-02-03
    • 2018-02-23
    • 2015-06-12
    • 1970-01-01
    • 2014-05-29
    • 2018-04-26
    • 2011-11-17
    • 2018-07-06
    • 2023-03-31
    相关资源
    最近更新 更多