双精度浮点数如何转换为单精度浮点格式?

Aad*_*hah 0 floating-point type-conversion double-precision ieee-754 single-precision

将数字从双精度浮点格式转换单精度浮点格式会导致精度损失.用于实现此转换的算法是什么?

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

Eri*_*hil 5

最常见的浮点格式是IEEE 754标准中规定的二进制浮点格式.我会回答你关于这些格式的问题.在标准的新(2008)版本中也有十进制浮点格式,并且存在除IEEE 754标准之外的格式,但754二进制格式是迄今为止最常见的格式.有关舍入的一些信息以及标准的链接位于此维基百科页面中.

将双精度转换为单精度与处理任何操作的结果相同.(例如,加法,乘法或平方根具有精确的数学值,并且该值根据规则舍入以产生从操作返回的结果.出于转换的目的,输入值是精确的数学值,并且它是圆的.)

通常,计算环境具有一些默认的舍入模式.(各种编程语言可以提供更改默认舍入模式的方法,或者特别针对每个操作指定它.)默认舍入模式通常是舍入到最接近的.其他的是圆向零,向正向无穷大(向上),向圆向负无穷大(向下).

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

在round-to-infinity模式中,返回大于或等于精确值的最接近的可表示值.因此,0x1.fffffep127以上的任何值都会舍入到无穷大.Round-towards-negative-infinity返回最接近的可表示值,该值小于或等于精确值.Round-to-zero返回朝向零的方向上最接近的可表示值.

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

  • 关于十六进制格式的说明:0x<fraction>p<exponent> 代表将 <fraction> 解释为十六进制数字(包括标记单位位置的点)并将其乘以 2 的 <exponent> 次幂的结果. 这使得很容易看到浮点值的表示,并看到诸如 0x1.fffffep127 是最大可表示的有限值这样的事实,因为其有效数中的所有 24 位都打开并且它具有最大指数 127 . (2认同)