为什么Double.MIN_VALUE不是否定的

mo-*_*eph 148 java floating-point numbers

任何人都可以解释为什么Double.MIN_VALUE实际上不是双打可以采取的最小值?这是一个正值,Double可以是负面的.

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

此外,双打可以采取的最低价值是多少?是-Double.MAX_VALUE吗?文档似乎没有说.

aio*_*obe 164

IEEE 754格式有一位保留用于符号,其余位代表幅度.这意味着它在origo周围是"对称的"(而不是Integer值,它有一个更多的负值).因此,最小值与最大值完全相同,符号位发生变化,因此,-Double.MAX_VALUE您可以用a表示的最小可能实际数字double.

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

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

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

是关于这个主题的好文章.

  • 谢谢你.我正在移植一些统计分析代码并盲目地将java转换为C#.我注意到-infinity或NaN出现了一些数字,并仔细研究了算法.我意识到double.MIN_VALUE在上下文中没有任何意义并进行了搜索.这篇文章出现在java文档之前.对于真正的双重来说,这真是一个令人困惑的名字.Epsilon.没什么大不了的,花了不到一分钟的时间来修复,但绝对令人惊讶. (3认同)

Dur*_*dal 10

这些常数与符号无关.如果您将double视为三个部分的组合,则更有意义:Sign,Exponent和Mantissa.Double.MIN_VALUE实际上是尾数在冲洗到零之前处于最小值时可以假设的最小值.同样地,MAX_VALUE可以被理解为当在无穷大的冲洗发生之前指数处于最大值时尾数可以假设的最大值.

这两者的更具描述性的名称可能是最大绝对(为verbositiy添加非零)和最小绝对值(为verbositiy添加非无穷大).

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


Phi*_*ßen 7

我认为令人困惑的名称可以追溯到 C,它定义FLT_MIN为最小的正数。

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


Col*_*ert 5

double 的最小值Double.NEGATIVE_INFINITY因此并不是Double.MIN_VALUEa 的最小值Double

由于 double 是浮点数,因此只能使用最大的数字(精度较低)或最接近 0 的数字(精度较高)。

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

  • 按照这个想法,Double Double.MAX_VALUE 或 Double.POSITIVE_INFINITY 的最大值是多少? (2认同)