为什么Double.MIN_VALUE不是负数


157

任何人都可以阐明为什么Double.MIN_VALUEDoubles实际不能使用的最小值吗?它是一个正值,而Double可以当然是负值。

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

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


1
感谢您的回复!范围和精度之间的差异是合理的。我仍然发现命名很奇怪且不一致,但这是可行的。
mo-seph 2010年

1
我正在猜测,因为它是由调用方法的相同的天才写writeBytesString
Trejkaz

基本上,您是对的,这是错误的语义
-Alvaro

Answers:


180

IEEE 754格式为符号保留一位,其余位代表幅度。这意味着它在origo周围是“对称的”(与具有另一个负值的Integer值相反)。因此,最低值就是一样的最大值,用符号位改变,所以是的-Double.MAX_VALUE是你可以用一个代表最小的实际数量double

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

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

(请注意,这里也有,Double.NEGATIVE_INFINITY但我不予理,,因为这被视为“特殊情况”,实际上并不代表任何实际数字。)

是有关该主题的好文章。


3
谢谢你 我正在移植一些统计分析代码,并盲目地将Java转换为C#。我注意到一些数字出现在-infinity或NaN处,并仔细研究了该算法。我意识到double.MIN_VALUE在上下文中毫无意义,因此进行了搜索。这篇文章出现在Java文档之前。对于double.Epsilon,这确实是一个令人困惑的名称。没什么大不了的,花了不到一分钟的时间来解决,但绝对令人惊讶。
Ed S.

难道“可以代表的最小绝对值”应该被命名为“ε”吗?
Dave Cousineau

@Sahuagin,将其命名为任何特殊的东西并不是真的“应该”。Epsilon只是希腊字母,通常代表数学/物理学中任意小的正数。去选择SmallestNonzeroFloat64例如。
aioobe

12

这些常数与符号无关。如果您将double看作是由三个部分组成的组合,则这更有意义:Sign,Exponent和Mantissa。Double.MIN_VALUE实际上是在刷新为零之前,当指数处于最小值时,尾数可以假定的最小值。同样,可以将MAX_VALUE理解为在刷新为无穷大之前,当指数处于最大值时,尾数可以假定的最大值。

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

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



3

双精度值的最小值就是Double.NEGATIVE_INFINITY为什么Double.MIN_VALUE这并不是真正的最小值Double

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

如果您确实想要一个非小数的最小值,那么您可以使用-Double.MAX_VALUE


1
按照这个想法,Double Double.MAX_VALUE或Double.POSITIVE_INFINITY的最大值是多少?
mo-seph

Double.MIN_VALUE可能等于Double.NEGATIVE_INFINITY
starblue 2010年

@starblue,不。@ mo-seph,,Double.POSITIVE_INFINITY+∞>一切,-∞<一切
Colin Hebert,2010年

@Colin Hebert,> =和<=精确;-)
aioobe 2010年

你可能误会了我。在一个更好的世界中,Double.MIN_VALUE它将等于Double.NEGATIVE_INFINITY,因为这样它将与MIN_VALUE整数类型中的一致。我可以初始化任何变量以计算最大值,MIN_VALUE这是正确的。在Double.MIN_VALUE我们现在将有一个更好的名字。(并类似地表示MAX_VALUE。)
starblue 2010年

2

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

/**
 * 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才有意义?似乎已明确定义。
mo-seph

因为它的最大精确值(非无限),不考虑其符号。
约翰·加德纳

0

正如文件中所说,

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

这里的窍门是我们正在谈论浮点数表示。double数据类型是双精度64位IEEE 754浮点。浮点数轻松表示从1,000,000,000,0000.0000000000000001的数字,同时最大化刻度两端的精度(数字的位数)。(有关更多信息,请参阅

尾数,始终为正数,持有浮点数的显著数字。指数表示应将尾数和符号相乘的基数的正或负幂。如下将这四个分量进行组合以获得浮点值。

在此处输入图片说明

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

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


以下只是供参考。

从2 ^ -1074到2 ^ 1023,双精度浮点可以表示2,098的2的幂。2的非正规幂是2 ^ -1074到2 ^ -1023的幂;2的归一化幂是2 ^ -1022到2 ^ 1023的幂。参照这个这个


谢谢!我不知道为什么这个答案被否决了。
合并
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.