lsa*_*eda 2 floating-point precision double ieee-754
我一直在阅读,似乎 IEEE 754 将 64 位浮点数(双)指数定义为 11 位。( https://en.wikipedia.org/wiki/Double-precision_floating-point_format )
我的问题是为什么?
64 位浮点数有 53 位有效数(第一位暗示为 1,因此实际仅存储 52 位)-因此您需要指数至少能够表示数字 53(以便能够移动二进制基数指向有效数中的任何位置),因此现在您需要 7 位。
然后你还需要负指数,所以 8 位。
此外,您还需要表示 0、负无穷大和正无穷大以及 NaN-(需要 4 个额外的表示),所以我猜是 10 位。
所以我的问题是:为什么指数是 11 位而不是 10 或 12 位,以及如何确定其他长度的浮点数?
相关:为什么更高精度的浮点格式有这么多指数位?关于为什么设计选择是这样的。
维基百科的https://en.wikipedia.org/wiki/Double-precision_floating-point_format非常好。
另请参阅https://randomascii.wordpress.com/2012/02/25/comparing-floating-point-numbers-2012-edition/Bruce Dawson 的系列 FP 文章是中级/高级理解 FP 的必备读物。
此外https://www.h-schmidt.net/FloatConverter/IEEE754.html是伟大的尝试位模式。
关于为什么指数字段必须是某个最小长度的大部分推理都是错误的! 您引用的一些因素是通用用例的合理设计选择,但不是必需的。
设计选择是提供大量动态范围以在大范围数字上保持高精度。
所以你需要指数至少能够表示数字 53(能够将二进制小数点移动到有效数中的任何位置),所以现在你需要 7 位。
不对。IEEE754 风格的二进制浮点格式需要支持足够大的指数范围以实现这一点,这并没有内在的原因。如果大数不重要,您可以选择很少的指数位,即使指数最大,最近的可表示值也比 1.0 更近。
此外,6 位为您提供 64 个指数值,这足以将二进制小数点移到 53 位有效数的末尾之外。
然后你还需要负指数,所以 8 位。
是的,希望动态范围以 1 为中心是非常合理的。但是对于某些用例,例如音频处理,您可能只使用幅度从[0..1). 或者最多4为更大的临时值留出一些空间。
在这种情况下,您希望选择指数偏差,让大部分指数值代表负指数。
此外,您还需要表示 0、负无穷大和正无穷大以及 NaN-(需要 4 个额外的表示),所以我猜是 10 位。
不,它不需要额外的标志位,只需要指数编码之一来根据有效数发出 Inf/NaN 信号。 因此,对于您假设的 8 个指数位,这只会将实际数字的可能指数值从 256 减少到 255。例如 2^-127 到 2^+127 仍然是一个很大的范围。
最大(全 1)指数值表示 Inf(有效数 = 0)或 NaN(任何其他有效数值),因此 IEEE binary64 在 NaN 有效负载上花费 2x 2^52 位模式 - 其 2^64 编码空间中的 2 个。这并没有像设计者希望的那样有用,并且可能更好地用于逐渐溢出,例如次正规如何允许逐渐下溢。
+-0.0是次正规数的一种特殊情况,具有最小指数值(编码为 0)且有效数 = 0。 Biased exponent=0 意味着有效数的前导 0,而不是通常的隐式 1。其他有效数值为实数,允许逐渐下溢。这种特殊情况需要另一个指数值远离“正常”数字。
所以 0.0 由一个全零位模式表示,这非常方便,因为内存通常用整数零初始化,并且它可以用memset(只接受 1 字节模式,而不接受 4 或 8 -byte 模式,您需要使用任何其他重复来初始化数组double)
| 归档时间: |
|
| 查看次数: |
481 次 |
| 最近记录: |