为什么 Double.MIN_VALUE 不是负数

新手上路,请多包涵

谁能阐明为什么 Double.MIN_VALUE 实际上不是 Doubles 可以采用的最小值?它是一个正值,而 Double 当然可以是负值。

我明白为什么它是一个有用的数字,但它似乎是一个非常不直观的名称,尤其是与 Integer.MIN_VALUE 相比时。调用它 Double.SMALLEST_POSITIVEMIN_INCREMENT 或类似的将有更清晰的语义。

另外,Doubles 可以取的最小值是多少?是 -Double.MAX_VALUE 吗?文档似乎没有说。

原文由 mo-seph 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1.2k
2 个回答

IEEE 754 格式保留一位用于符号,其余位表示幅度。这意味着它围绕 origo 是“对称的”(与具有多一个负值的整数值相反)。因此,最小值与最大值完全相同,符号位翻转,所以 的, -Double.MAX_VALUE 是你可以用 double 表示的最低实际数字。

我想 Double.MAX_VALUE 应该被视为 最大幅度,在这种情况下,简单地写 -Double.MAX_VALUE 实际上是有意义的。它还解释了为什么 Double.MIN_VALUE 是最小的正值(因为它代表最小可能的幅度)。

但可以肯定的是,我同意命名有点误导。习惯了 Integer.MIN_VALUE 的意思,读到 Double.MIN_VALUE 是可以表示的最小 绝对值 时,我也有点惊讶。也许他们认为用一个代表最小可能值的常数是多余的,因为它只是一个 - 远离 MAX_VALUE :-)

(注意,还有 Double.NEGATIVE_INFINITY 但我无视这一点,因为它被视为“特例”,实际上并不代表任何实际数字。)

是一篇关于这个主题的好文章。

原文由 aioobe 发布,翻译遵循 CC BY-SA 4.0 许可协议

这些常量与符号无关。如果将 double 视为三部分的组合,这就更有意义了:Sign、Exponent 和 Mantissa。 Double.MIN_VALUE 实际上是当 Exponent 在刷新为零之前处于最小值时 Mantissa 可以假定的最小值。同样,MAX_VALUE 可以理解为当 Exponent 在刷新到无穷大之前处于最大值时 Mantissa 可以假设的最大值。

这两个的更具描述性的名称可以是 最大绝对值(为冗长添加非零值)和 最小绝对值(为冗长添加非无穷大)。

查看 IEEE 754 (1985) 标准了解详细信息。有一个修订版 (2008),但只引入了更多甚至不受 java 支持的格式(严格来说,java 甚至不支持 IEEE 754 1985 的某些强制性功能,就像许多其他高级语言一样)。

原文由 Durandal 发布,翻译遵循 CC BY-SA 2.5 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题