【问题标题】:Is IEEE 754 floating point representation wasting memory?IEEE 754 浮点表示会浪费内存吗?
【发布时间】:2017-04-08 17:16:03
【问题描述】:

我一直认为 double 类型的变量可以存储 2^64 个不同的小数值。 (每个位可以有 1 或 0 作为值,因此有 2^64 个不同的值)。

最近我知道 NaN(不是数字)有一个表示形式,其中指数部分是 11111111111,有效数字部分是任何非零值。 相反,如果指数部分是 11111111111 并且有效数字部分是 111111......(52 次),那么表示是 NaN 吗?

这不能让我们代表 2^52 多个不同的数字吗? 2^52 是一个巨大的数字。那么我们不是在浪费宝贵的空间吗?

【问题讨论】:

  • 首先,您的意思是 2^52 - 1。其次,请说明您提问的目的。
  • 2^52 大约是正常数字计数的十分之一。格式必须保持足够简单,以便硬件实现。
  • 是的,价值很小,但仍然不浪费。因为它在非常大的数字中占很小的比例。为了检查值是否为 Inf,他们可能会检查指数是否全为 1,以及尾数是否全为零,可能带有一些 OR 门。所以同样地,对于 NaN,检查尾数是否都是使用 AND 门的,对硬件来说一定不是一个严格的限制,对吧? (只是我的猜测)

标签: floating-point precision ieee-754


【解决方案1】:

IEEE-754 浮点格式的设计考虑了高效的硬件实现。所有特殊输入操作数都可以通过仅检查指数字段来检测,即 all-0(零和非正规)或 all-1(无穷大和 NaN)。因此,对于双精度,只需要一个 11 位的比较器,并且可以在处理器周期的一小部分内执行检查。

为无穷大和 NaN 保留 2048 种可能的指数编码之一并不是特别浪费。请注意,IEEE-754 使用两种不同类型的 NaN:信令 NaN 或 SNaN 在遇到时触发异常,而相当的 NaN 或 QNaN 只是通过计算传播,直到它们出现在人类可消费的最终结果中。尾数字段的最高位区分两种 NaN:对 SNaN 清零,对 QNaN 置位。

此外,IEEE-754 支持,但不需要,NaN“有效负载”的概念,即具有系统或用户定义含义的多个 NaN 编码。例如,“PowerPC Numerics”(Apple 1994)为 Macintosh 系统指定 NaN 小数字段的第 8 到第 15 个最高有效位包含一个 NaN 代码,该代码指示 NaN 的不同来源,例如sqrt() 是非零的负数,log() 是负数,反三角函数的参数无效,例如 asin()。如“Apple Numerics Manual, Second Edition”(Apple 1988)中所述,Apple II 引入的 SANE(标准 Apple 数值环境)已经使用了该概念。

C 和 C++ 标准通过 math.h / cmath 提供标准函数 nan(),可用于以实现定义的方式从字符串参数构造 NaN 有效负载。有关简要说明,请参见例如 here

【讨论】:

  • 感谢您的回答。首先,我并没有说使用 2048 种可能的指数编码中的 1 种是浪费的。我不是在谈论指数部分。相反,我正在讨论尾数部分(最后 52 位)。所以现在我知道有两种不同类型的 NaN 并且由尾数的 MSB 决定。好吧..我们还没有浪费剩下的 51 位吗?
  • 在我看来,这两条语句说的完全一样:通过 IEEE-754 双精度格式的构造,每个指数编码都与 2**52 尾数编码相关联。如果使用规范 NaN(这将符合 IEEE-754),则将仅使用三个尾数编码,保留指数值为全 1:一个 QNaN、一个 SNaN 和无穷大。重用其他 2*52-3 编码将不再需要将编码 all-1 的指数视为保留,而是将其共享​​>用于表示有限数.
  • 是的,我明白了。非常感谢@njuffa
【解决方案2】:

换句话说,它可能会浪费 0.048 % 的存储空间,但在更简单的芯片设计和电源效率方面却节省了十倍。我认为这是一笔不错的交易。

这在实践中意味着最大的可表示数字是~

179769313486231570000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 P>

359538626972463140000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 P>

所以这些“浪费”的价值无论如何都不会那么有用。

【讨论】:

    猜你喜欢
    • 2012-01-06
    • 1970-01-01
    • 2014-10-18
    • 1970-01-01
    • 1970-01-01
    • 2020-11-19
    • 2013-07-24
    • 1970-01-01
    • 2016-11-06
    相关资源
    最近更新 更多