【问题标题】:Why is Double.MIN_VALUE in not negative为什么 Double.MIN_VALUE 不是负数
【发布时间】:2025-11-20 15:15:02
【问题描述】:

谁能解释为什么Double.MIN_VALUE 实际上不是双打可以取的最小值?它是一个正值,Double 当然可以是负值。

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

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

【问题讨论】:

  • 感谢您的回复!范围和精度之间的差异是有道理的。我仍然觉得命名很奇怪和不一致,但它是可行的。
  • 我猜是因为它是由调用writeBytes 方法的同一位天才编写的,该方法采用String
  • 基本上,你是对的,这是不好的语义

标签: java numbers floating-point


【解决方案1】:

IEEE 754 格式保留一个位用于符号,其余位表示幅度。这意味着它在 origo 周围是“对称的”(与 Integer 值相反,它有一个负值)。因此,最小值与最大值相同,只是符号位发生了变化,所以是的-Double.MAX_VALUE 是您可以用double 表示的最小可能实际数字。 p>

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

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

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

Here 是一个很好的主题。

【讨论】:

  • 谢谢。我正在移植一些统计分析代码并盲目地将java翻译成C#。我注意到一些数字出现在 -infinity 或 NaN 处,并仔细研究了算法。我意识到 double.MIN_VALUE 在上下文中没有意义并进行了搜索。这篇文章出现在 java 文档之前。对于真正的 double.Epsilon,它确实是一个令人困惑的名称。没什么大不了的,修复不到一分钟,但绝对令人惊讶。
  • “能表示的最小绝对值”不应该命名为“epsilon”吗?
  • @Sahuagin,它并不是真的“应该”被命名为任何特定的东西。 Epsilon 只是一个希腊字母,通常代表数学/物理中任意小的正数。例如,Go 选择了SmallestNonzeroFloat64
【解决方案2】:

这些常量与符号无关。如果您将双精度数视为三个部分的组合:符号、指数和尾数,这就更有意义了。 Double.MIN_VALUE 实际上是当指数处于最小值时尾数可以假设的最小值,然后发生刷新为零。同样,MAX_VALUE 可以理解为当指数处于最大值时,Mantissa 可以假设的最大值,然后才发生刷新到无穷大。

这两者的更具描述性的名称可以是最大绝对值(添加非零表示详细)和最小绝对值值(添加非无穷大表示详细)。

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

【讨论】:

    【解决方案3】:

    我假设混淆名称可能是traced back to C,它将FLT_MIN 定义为最小的正数。

    就像在 Java 中,你必须使用 -Double.MAX_VALUE,你必须使用 -FLT_MAX 来获得 C 中的最小浮点数。

    【讨论】:

      【解决方案4】:

      double 的最小值是 Double.NEGATIVE_INFINITY,这就是为什么 Double.MIN_VALUE 并不是 Double 的最小值。

      由于 double 是浮点数,所以只能取最大的数(精度较低)或最接近 0 的数(精度高)。

      如果您真的想要一个非无穷大的双精度值的最小值,那么您可以使用-Double.MAX_VALUE

      【讨论】:

      • 按照这个想法,Double Double.MAX_VALUE 或 Double.POSITIVE_INFINITY 的最大值是多少?
      • Double.MIN_VALUE 可能等于 Double.NEGATIVE_INFINITY
      • @starblue,没有。 @mo-seph,Double.POSITIVE_INFINITY,+∞ > 一切和 —∞
      • @Colin Hebert,>= 和
      • 你可能误解了我的意思。在一个更美好的世界中,Double.MIN_VALUE 将等于 Double.NEGATIVE_INFINITY,因为这样它将与整数类型中的 MIN_VALUE 一致。我可以使用MIN_VALUE 初始化任何变量以计算最大值,这将是正确的。我们现在拥有的Double.MIN_VALUE 会有一个更好的名字。 (MAX_VALUE 也类似。)
      【解决方案5】:

      因为对于浮点数,精度很重要,因为没有精确范围

      /**
       * A constant holding the smallest positive nonzero value of type
       * <code>double</code>, 2<sup>-1074</sup>. It is equal to the
       * hexadecimal floating-point literal
       * <code>0x0.0000000000001P-1022</code> and also equal to
       * <code>Double.longBitsToDouble(0x1L)</code>.
       */
      

      但我同意它可能应该被命名为更好的名字:)

      【讨论】:

      • 好的,但是为什么有 Double.MAX_VALUE 有意义呢?这似乎是明确定义的。
      • 因为它的最大精确值(非无限),不考虑它的符号。
      【解决方案6】:

      正如documents 中所说,

      Double.MIN_VALUE 是一个常量,它保​​存了 double 类型的最小 POSITIVE 非零值 2^(-1074)。

      这里的诀窍是我们谈论的是浮点数表示。双精度数据类型是双精度 64 位 IEEE 754 浮点数。浮点数可以轻松地表示从 1,000,000,000,0000.0000000000000001 的数字,同时最大限度地提高刻度两端的精度(位数)。 (更多请参考this

      尾数,始终为正数,保存浮点数的有效数字。指数表示尾数和符号应乘以的基数的正或负幂。这四个分量组合为follows,得到浮点值。

      认为 MIN_VALUE 是尾数可以表示的最小值。因为浮点表示的最小值是可以使用它表示的最小幅度。 (虽然可以使用更好的名称来避免这种混淆)

      123 > 10 > 1 > 0.12 > 0.012 > 0.0000123 > 0.000000001 > 0.0000000000000001


      以下仅供参考。

      双精度浮点可以表示 2,098 的 2 次方,从 2^-1074 到 2^1023。 2 的非规格化幂是从 2^-1074 到 2^-1023 的幂; 2 的归一化幂是从 2^-1022 到 2^1023 的幂。参考thisthis

      【讨论】: