为什么Java中浮点(32位)的指数是-126而不是-128



32位标准:

1位表示数字的正值/负值。8位用于指数,24位用于Mantisse。

8位表示指数,表示1*2^7+1*2^6+…=255当最大Exponent为127时,最小Exponent应为-128,因此126+128=255。

但是Java为什么说最小指数是-126呢?255-(127+126(=2,所以有两个数字我们没有使用。

这个数字有"偏差",这些位中有什么?首先从中减去0x7F,得到您的值。使用值0x01:0x01 - 0x7F = 1 - 127 = -126可以达到最低指数。值0xFE:0xFE - 0x7F = 254 - 127 = 127达到最高。

但是,指数值0x000xFF发生了什么?这就是为什么有254个而不是256个唯一指数可用:这两个是特殊的魔术,通常不可用。指数0既用于编码0(如果分数的数字也是0(,也用于所谓的次正规数,即非常接近0的数字。

0xFF用于特殊值;这就是浮点可以存储NaN和两个无穷大的方法。

有两个指数序列对特殊值进行编码。根据尾数,所有0都编码0或子规范。所有1都编码无穷大或NaN。这意味着,正如你所说,有254个序列来编码正常数,而不是256个指数序列。

因此,指数00000001编码幂-126和1111111 0编码幂127是有道理的。这是正常数字的指数范围。

https://en.wikipedia.org/wiki/Single-precision_floating-point_format

最新更新