【问题标题】:Why is the Exponent for Float (32 Bit) in Java -126 and not -128?为什么 Java 中浮点数(32 位)的指数是 -126 而不是 -128?
【发布时间】:2019-11-02 13:22:43
【问题描述】:

32 位标准:

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

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

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

【问题讨论】:

  • Java float 只是标准的 IEEE 754 单精度浮点数。这个wiki page 详细说明了格式规范。我没有时间摘录相关部分来撰写答案,因此您可能需要自己去找。
  • @Optimal “为什么 Java 说最小指数是 -126?” 请提供记录到该页面的链接。

标签: java floating-point ieee-754 single-precision


【解决方案1】:

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

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

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

【讨论】:

  • 为什么次正规数是“所谓的”次正规数?他们实际上不比正常数字少吗?您是否对它们是否真的是次常数表示怀疑?
  • @EricPostpischil:我认为这是引入一个术语的意义上的“所谓”,而不是质疑该术语的适当性。 merriam-webster.com/dictionary/so-called
  • @MarkDickinson:确实,但使用可能带有贬义的模棱两可的术语并不好。最好简单地用斜体表示它是一个正在引入的技术术语。
  • 我在stackoverflow.com/a/58924829/1766831解决了你的许多问题
【解决方案2】:

有 2 个指数序列编码特殊值。所有 0 编码 0 或次正规,具体取决于尾数。所有 1 都编码 Infinity 或 NaN。这意味着就像你说的那样,有 254 个序列来编码正常数字,而不是 256 个指数序列。

因此,指数 00000001 编码 -126 次方,而 11111110 编码 127 次方是有道理的。这是正常数字的指数范围。

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

【讨论】:

  • 你能解释一下最后一句吗因此,指数 00000001 编码为 -126 的幂,而 11111110 编码为 127 的幂是有道理的。这是正常数字的指数范围。?你如何将 [0...254] 值编码为 [-126...127] ?
  • @snr,我的回答是对原始问题的回应,这就是为什么似乎没有使用 2 个序列的原因。您的问题是如何解码指数,这是完全不同的。简短的回答是需要应用 -127 的偏移量来解码指数。更详细的解释可以在我链接的 wiki 页面上找到。
猜你喜欢
  • 2019-06-30
  • 2023-02-14
  • 2011-09-13
  • 2014-09-27
  • 1970-01-01
  • 1970-01-01
  • 2019-03-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多