获取最负的双精度数的正确方法

34

这是在Java中获取最负double类型的正确方式吗?

double v = -Double.MAX_VALUE;
2个回答

31

假设您所说的是最大的负无穷数而非负数,则正确,因为在64位 IEEE 754 浮点数(这是Java使用的双精度浮点数格式)中:

  • 数值大小存储在二进制表示的一个部分中
  • 数值的符号存储在二进制表示的另一部分中

因此: 可表示的最大负数将与可表示的最大正数相同,但符号位将翻转以表示负数。


为什么(-Double.MAX_VALUE - 1)不等于负无穷大呢? - Dean J
抱歉,我的思维集中在整数上...正如所指出的那样,浮点数不使用二进制补码。 - Seth Moore
char类型的情况怎么样?最大的正数char是127,但最大的负数char是-128,而不是-127。这对于double类型来说是不是一个特殊情况呢? - Cheok Yan Cheng
这是针对浮点数和双精度浮点数的特殊情况,它们在底层使用IEEE浮点表示。各种整数类型(其中byte可以被认为是一种)使用2's补码。我相信它们所有都有一个"MIN_VALUE"字段,您可以使用它来获取它们最负值。 - RHSeeger
@DeanJ:因为它们是浮点数。当你从Double.MAX_VALUE中减去1时,它首先被转换为MAX_VALUE的指数,这需要四舍五入,在这种情况下,使被减数为0。 - Franz D.

24

不,它是Double.NEGATIVE_INFINITY。


RHSeegar 的评论怎么样? - Cheok Yan Cheng
4
这是否是一个有效的双精度数?是的,它是一个明确定义的IEEE 754双精度值。Double.NEGATIVE_INFINITY小于-Double.MAX_VALUE,并且根据定义<=所有双精度数(除了无序的NaN)。因此它是最负的双精度数,这就是OP的问题。 - Sean Owen
有两种可能的解释“最负的双倍数”。其一是负无穷大......即最大的双倍数。第二种是最大可表示的双倍数,这正是我的帖子所描述的内容。 - RHSeeger
1
这是一个有趣的话题,但与正题无关——为什么您不认为负无穷是可表示的?这种双精度浮点数确实存在。 - Sean Owen
@RHSeeger,如果使用术语“数字”而不是“double”,我会同意。但由于无穷大是“double”包括的值之一,并且原始问题要求双倍,所以一切都没问题;) - ony

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接