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

Floating point IEEE 754浮点表示是否浪费内存?,floating-point,precision,ieee-754,Floating Point,Precision,Ieee 754,我一直认为一个double类型的变量可以存储2^64个不同的分数值。(每个位可以有1或0作为值,因此2^64个不同的值) 最近我知道NaN(不是数字)有一个表示法,其中指数部分是11111,有效位部分是任何非零值。 相反,如果指数部分为11111,有效位部分为111111,则表示为NaN……(52次) 这不允许我们再代表2^52个不同的数字吗?2^52是一个巨大的数字。那么,我们不是在浪费宝贵的空间吗 IEEE-754浮点格式的设计考虑了高效的硬件实现。只能通过检查指数字段来检测所有特殊输入操作

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

最近我知道NaN(不是数字)有一个表示法,其中指数部分是11111,有效位部分是任何非零值。 相反,如果指数部分为11111,有效位部分为111111,则表示为NaN……(52次)


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

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

将2048种可能的指数编码中的一种保留为无穷大和nan并不是特别浪费。请注意,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()
。苹果II引入的SANE(标准苹果数字环境)已经使用了该概念,如“苹果数字手册第二版”(苹果1988)所述


< > C和C++标准提供了标准函数<代码> n>()/Cube >通过代码>数学.H< /Cult>/Cuth.CaseMease/Cord>,可以用一个实现定义的方式从字符串参数构造NANN有效载荷。有关简要说明,请参见示例。

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

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

17976931348623157000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000

3595386269724631400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000


因此,这些“浪费”的值无论如何都不会有多大用处。

首先,您的意思是2^52-1。第二,请解释你问题的目的。2^52大约是正常数字计数的十分之一。格式必须保持足够简单,以便硬件实现。是的,它的价值很小,但仍然不浪费。因为它只占非常大的数字的一小部分。为了检查值是否为Inf,他们可能会检查指数是否为全1,尾数是否为全零,可能会使用一些OR门。所以同样,对于NaN来说,检查尾数是否都是使用的,并且gates在硬件上一定不是一个严格的约束,对吗?(我猜)谢谢你的回答。首先,我没有说使用2048种可能的指数编码中的1种是浪费的。我不是说指数部分。取而代之的是尾数部分(最后52位)。现在我知道有两种不同类型的NaN,由尾数的MSB决定。好的,我们仍然没有浪费剩余的51位吗?在我看来,这两条语句说的是完全相同的事情:通过构建IEEE-754双精度格式,每个指数编码与2**52尾数编码相关联。如果使用规范NaN(这将符合IEEE-754),则只使用保留指数值为all-1的三个尾数编码:一个QNaN、一个SNaN和无穷大。重复使用其他2*52-3编码将不再需要将指数编码all-1视为保留编码,而是将其共享以表示有限数。是的,我明白了。非常感谢@njuffa