将数字从双精度浮点格式转换为单精度浮点格式会导致精度损失。用于实现这种转换的算法是什么?
数字是大于3.4028234e+38
还是小于-3.4028234e+38
简单地减少到各自的限制?我觉得转换过程比这更复杂,但我找不到它的文档。
最常见的浮点格式是 IEEE 754 标准中指定的二进制浮点格式。我将回答您对这些格式的问题。新版(2008 年)标准中还有十进制浮点格式,还有 IEEE 754 标准以外的格式,但 754 二进制格式是迄今为止最常见的格式。一些关于四舍五入的信息,以及标准的链接,都在这个维基百科页面中。
将双精度转换为单精度与对任何操作的结果进行舍入相同。(例如,加法、乘法或平方根具有精确的数学值,并且该值根据规则四舍五入以产生从操作返回的结果。为了转换的目的,输入值是精确的数学值,并且它是圆形的。)
通常,计算环境有一些默认的舍入模式。(各种编程语言可能会提供更改默认舍入模式的方法,或者专门针对每个操作指定它。)默认舍入模式通常是舍入到最近的。其他是向零舍入、向正无穷大舍入(向上)和向负无穷大舍入(向下)。
在四舍五入模式下,返回最接近精确值的可表示数字。如果出现平局,则返回具有偶数低位(在其小数或有效数中)的数字。为此,无穷大实际上就像是有限数模式中的下一个值一样。在单精度中,最大的有限数是 0x1.fffff8p127、0x1.fffffap127、0x1.fffffcp127 和 0x1.ffffffep127。(单精度有效数中有 24 位,因此该位中的步长是最后一个十六进制数字中的步长 2。)出于舍入目的,无穷大就像它在 0x2p128 处一样。因此,如果确切结果更接近 0x1.ffffffep127(因此,小于 0x1.ffffffp127),则将其四舍五入为 0x1.ffffffep127。如果大于等于 0x1.ffffffp127,则四舍五入为无穷大。负无穷大的情况是对称的。
在向无穷大舍入模式下,返回大于或等于精确值的最接近的可表示值。因此,任何高于 0x1.ffffep127 的值都会四舍五入为无穷大。向负无穷大舍入返回小于或等于确切值的最接近的可表示值。向零舍入返回向零方向最接近的可表示值。
IEEE 754 标准只规定了结果;它没有指定算法。用于实现舍入的方法取决于每个实现。