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

为什么在Java-126中浮点(32位)的指数是-128而不是-126?,java,floating-point,ieee-754,single-precision,Java,Floating Point,Ieee 754,Single Precision,32位标准: 1位表示数字的正负值。指数为8位,尾数为24位 8位表示指数,表示1*2^7+1*2^6+…=255 当最大指数为127时,最小指数应为-128,因此126+128=255 但是为什么Java说最小指数是-126呢?255-(127+126)=2,所以有两个数字我们没有使用。这个数字有一个“偏差”,这些位中有什么?首先从中减去0x7F,得到您的值。使用值0x01:0x01-0x7F=1-127=-126可达到最低指数。值0xFE达到最大值:0xFE-0x7F=254-127=127

32位标准:

1位表示数字的正负值。指数为8位,尾数为24位

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


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

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

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


0xFF
用于特殊值;这就是浮点数如何存储NaN和两个无穷大。

有两个指数序列编码特殊值。根据尾数,所有0编码为0或低于正常值。所有1编码为无穷大或NaN。这意味着,正如您所说,有254个序列来编码正常数字,而不是256个指数序列

因此,指数00000001编码幂-126和11111110编码幂127是有意义的。这是正常数字的指数范围


Java
float
只是标准的IEEE 754单精度浮点数字。这详细说明了格式规范。我没有时间摘录相关部分来撰写答案,因此您可能需要自己去寻找。@Optimal“为什么Java说最小指数为-126?”请提供到记录此内容的页面的链接。这里:为什么次正常数是所谓的“次正常数”?事实上,这些数字是否低于正常数字?你是在怀疑它们是否真的是低于正常水平的数字吗?@EricPostPhischil:我认为这是“所谓”的意思,即引入一个术语,而不是对该术语的恰当性产生怀疑@马克迪金森:是的,但是使用一个可能带有贬义的含糊不清的术语是不好的。最好简单地用斜体字表示这是一个正在引入的技术术语。我在中回答了您的许多问题。您能解释最后一句话吗?因此,指数00000001表示幂-126,11111110表示幂127是有意义的。这是正常数字的指数范围。?您如何将[0…254]值编码为[-126…127]?@snr,我的回答是针对原始问题的,这就是为什么有两个序列似乎没有被使用。你的问题是指数是如何解码的,这是完全不同的。简单的回答是需要应用-127的偏移量来解码指数。更详细的解释可以在我链接的wiki页面上找到。