我一直认为有2 ^ 64个不同的小数值可以由double类型的变量存储。 (每个位可以有1或0作为值,因此2 ^ 64个不同的值)。
最近我发现NaN(不是数字)有一个表示,其中指数部分是11111111111,有效部分是任何非零值。 相反,如果表示是NaN,如果指数部分是11111111111并且有效部分是111111 ......(52次)?
这不会让我们代表2 ^ 52个更多不同的数字吗? 2 ^ 52是一个巨大的数字。那么我们不浪费宝贵的空间吗?
答案 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;无论如何,价值观都不会有用。