IEEE 754浮点表示是否浪费内存?

时间:2016-11-24 11:54:30

标签: floating-point precision ieee-754

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

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

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

2 个答案:

答案 0 :(得分:3)

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

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

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

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

答案 1 :(得分:0)

换句话说,它可能会浪费0.048%的存储空间,但在更简单的芯片设计和功效方面可以节省十倍的成本。我认为这是一个非常好的协议。

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

  

179769313486231570000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000

     

359538626972463140000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000

所以这些"浪费了#34;无论如何,价值观都不会有用。