理论上最小的浮点格式是什么?

What is theoretically the smallest floating point format possible?

假设您正在考虑将 IEEE-754 格式用于单精度和双精度等浮点数,您可能拥有的最小浮点格式是什么?

我知道有 half-floats 和 miniflooats,但有多小才有意义?我知道应用程序可能无法使格式适合任何实际使用。

我正在尝试确定您可以拥有的最小尾数位宽和最小指数宽度是多少?

例如,使用 X.X 格式的尾数是否有意义(假设单精度表示为 X.XXXXXXXXXXXXXXXXXXXXXXX)? 另外,有一个宽度为 1 的指数有意义吗?

举例说明我的想法:

如果你有 X.X 格式,并且没有指数,那么你唯一可能的数字是 +/- {1.0,1.1},但是浮点数或格式是否有一些基本的东西使得这些不可能考虑一下?

总的来说,浮点数的全部意义在于能够表示比某些二进制数表示所允许的范围更广的值,无论大小。

我遇到的最小的实用格式是微型 8 位浮点表示法。它看起来像这样:

[ 1-bit sign ] [ 4-bit exponent ] [ 3-bit mantissa/fraction ]

在这种情况下,您的指数范围限制在 1/64 到 128 之间(因为您需要 NaN/infinity 的表示)。回想一下,FP 被评估为 sign x (1 + mantissa) x 2^(exponent - bias).

你可以继续从 IEEE-754 格式推断,甚至想出 6 位浮点表示:

[ 1-bit sign ] [ 3-bit exponent ] [ 2-bit mantissa/fraction ]

但最终发生的是有效值的分布变得更接近于零(即,与离零更远的数字相比,您能够更精确地表达更接近于零的数字)。

我想你可以继续前进,直到你只是 运行 位(也许你放弃符号,或者你根据你的应用程序和你需要的有效值改变偏差),但在某些时候你需要重新考虑调用你的格式 "floating point".

八位浮点格式作为一种数据存储格式并不少见(例如,μ-law 音频编码基本上就是一种浮点格式)。它们通常不用于存储分数,而是用于将相当小的整数的近似值存储在更小的 space 中。带有 4+1 位尾数的有符号格式可以精确地容纳高达 +/-31 的整数,并且最大范围为 +/- 1,984 (31*64);具有 4+1 位尾数的无符号格式可以将该范围扩展到 507,904 (31*16,384)。这样的格式对计算没有用,因为每次计算都可能会丢失大量的尾数,而且可以开始的尾数不多。尽管可以使用较小的浮点格式,但通常使用映射 tables 会更好。例如,当使用带有 2+1 位尾数的浮点格式时,从 32 到 80 的值将构成序列 (32, 40, 48, 56, 64, 80);连续值之间的比率范围从 5:4 (1.250) 到 8:7 (1.143).

使用 "smoother" 压扩 tables,每 2 个因子有四个步骤,可以使用序列 (32, 38, 45, 54, 64, 76),屈服比 (1.188, 1.184、1.200、1.185、1.188)。如果只有例如64 个可能的信号值,一个 64 项 table 将允许将任何值转换为其更长的表示;反向转换可能需要稍大的 table,但即使 table 也可能很小,因为最大和最小 representable 值之间的比率不会很大.

我偶尔使用四位 FP 格式:2 个指数位和 1 个有效位。这将为您提供以下一组值:

encoding    value
  x000     +/-0.0
  x001     +/-0.5
  x010     +/-1.0
  x011     +/-1.5
  x100     +/-2.0
  x101     +/-3.0
  x110     +/-Inf
  x111        NaN

显然,您不能用这种格式做很多有用的计算,但它对教学很有用,因为它是最小的格式,可以为您提供所有有趣的边缘情况(不过,如果您关心它,则不会发出 NaN 信号) ,除非你想发出“-NaN”信号。

从某种意义上说,这是 "smallest" 浮点格式,它并非完全退化,但您仍然永远不会使用它,因为它基本上在所有方面都比 4 位有符号固定格式差-point 格式,带有一个小数位。在一般设置中真正通过此测试的最小浮点格式是半精度(尽管 8b 格式有 一些利基用途)。

有效位的三位格式几乎可以工作;它为您提供 +/-0、+/-1、+/-2 和 +/-Inf,但如果您遵循通常的 IEEE-754 编码规则,则没有可用的 NaN 编码。对 Inf 使用 b010 对 NaN 使用 b011 会更好,但是在算术中不会发生舍入(除了 1 + 1 溢出),这对教学不是很有用。