为什么Double.MIN_VALUE不是负面的

2022-08-31 06:37:09

任何人都可以解释一下为什么实际上不是双打可以采取的最小值?它是一个正值,双精度值当然可以是负值。Double.MIN_VALUE

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

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


答案 1

IEEE 754 格式为符号保留了一个位,其余位表示幅度。这意味着它在origo周围是“对称的”(与整数值相反,后者还有一个负值)。因此,最小值与最大值相同,符号位已更改,因此是的,是可以用.-Double.MAX_VALUEdouble

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

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

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

这是关于这个主题的一个很好的文本。


答案 2

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

这两个名称的描述性更强的名称可以是“最大绝对值”(为详细添加非零)和“最小绝对值”(为详细添加非无穷大)。

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