128、64 和 32 位 IEEE-754 浮点数之间的关系

Relationships between 128, 64, and 32 bit IEEE-754 floating point numbers

我想熟悉并熟悉浮点数。我正在做一个项目,希望通过在 C++ 中创建动态分配的、任意大小的浮点数来帮助我实现这一目标。我查看了标准浮点定义的 IEEE-754 规范,但我找不到它们之间的共同关联(我使用维基百科中关于 32, 64, and 128 位浮点数的参考)。所以我的问题是:浮点数之间是否存在可以应用于任意大小的浮点数的通用模式?

如果不是,从编程的角度来看,定义我自己的具有模式的浮点表示会更容易吗?

编辑:模式是指尾数和指数中的位。

有效数1或指数中的位数没有强制性的数学规则。 IEEE 754-2008 确实显示了一个公式来描述其列出的某些尺寸的交换格式,但这是在非规范性注释中:

  • 对于存储宽度k位,有效位中的位数(带前导位的数学有效位,不是主要编码它的字段没有前导位) , p, 是 k−round(4×log2(k))+13.
  • 指数字段中的位数,w,是kp .

该公式不适用于 16 位或 32 位;据说它只适用于 64 位和宽度是 32 的倍数大于或等于 128(因此宽度不是 32 或 96)。我想您可以将其视为更大尺寸的建议,但它不具有约束力。

据我所知,IEEE 754-2008 条款 3.6 的 table 3.5 中指定的参数来自平衡和历史使用。您可以使用第 3.7 节中描述的其他参数定义格式。 3.7 给出了一些使用精度参数(尾数中的数字)和最大指数或仅精度参数来定义扩展精度的建议。或者您可以忽略 IEEE 754 并定义您自己的格式。标准不是强制性的,您的设计应该是目标的函数。

备注

1 “有效数”是浮点数小数部分的首选术语。 “尾数”是对数的小数部分的术语。尾数是线性的(如果数字增加 1.2 倍,则尾数增加 1.2 倍,除非超过指数阈值),尾数是对数的。

2008 版 IEEE754 定义了大于 128 位的交换格式应遵循通用方法。

对于二进制格式,全宽k 应为32 位的倍数,指数字段位数应为round(4 * log2 (k)) – 13。可以确定这个公式也给出了 64 位和 128 位格式的正确值,但不是 16 位或 32 位格式(它们的指数更宽)。

对于十进制格式,全宽k应为32位的倍数,组合字段位数应为k / 16 + 9。这也给出了 32、64 和 128 位格式的实际数字。

格式及其操作的所有其他属性应保持不变,包括有效位解释、指数偏差和解释、目标舍入等。如果你

could not find a common correlation between them

您可能对定义字段宽度时缺乏可见逻辑感到困惑。是的,它们是经验性的,即比起通用逻辑,它们更多地适应了数字处理方面积累的经验和将更多数据放入小房间的要求。

另一方面,您并不局限于这些标准限制。此外,只要 IEEE 主要针对硬件设计,而 IEEE754 标准是为便于硬连线实现而设计的,您无需遵守其限制,可以利用任何软件实现(如 GMPMPFR) .软件实现的优势在于无需花费时间来解压用于计算的数字并将它们打包回去。

IEEE-754 二进制类型指定指数位宽如下。

FP bit size  Expo bit size
16           5
32           8
64           11
128          15
256          19

该类型的其余部分使用1个符号位和signifcand。

根据 ,对于 32 及以上的倍数,指数位宽为 round(4 * log2 (k)) – 13

empirical answer 到 "Is there a common pattern between floating point numbers that can be applied to any arbitrarily sized floating point number?" 可以使用以下内容来保持与现有 IEEE-754 标准的相关性并扩展到其他位大小 fp_size >= 8(或 >= 6 如果你想推动它)。

int expo_width(int fp_size) {
  return lrint(fp_size >= 32 ? 4*log2(fp_size)-13, 3*log2(fp_size)-7);
}

在另一个线程中,基于官方列出的线程,我创建了一个统一的公式,适用于从 16 到 256 的所有位级别(对于更高的位级别也有合理的输出,但由于那些避风港没有正式定义,其准确性没有参考框架)::请参阅: