繁体   English   中英

Double.POSITIVE_INFINITY == Float.POSITIVE_INFINITY

[英]Double.POSITIVE_INFINITY == Float.POSITIVE_INFINITY

我试过

System.out.println(Double.isInfinite(Float.POSITIVE_INFINITY))
System.out.println(Double.isInfinite(Float.NEGATIVE_INFINITY));

output 是

true
true

那么这意味着两种数据类型的“无穷大”是一样的吗?

是和不是。 是的,因为在抽象意义上无限就是无限(而且,正如我在下面解释的那样,出于大多数代码的目的,浮点数无论如何都会转换为双精度数)。

但是,不,因为在位级别上,两个无穷大是不同的。 double 在 Java 中是 64 位,而 float 在 Java 中是 32 位,所以它们在表示级别上是不同的。

在 Java 中,浮点数(浮点数和双精度数)使用IEEE 754浮点格式表示,这是当今几乎每个人都使用的标准。 每个数字都以二进制表示为一个符号位,加上一定数量的指数位,再加上一定数量的尾数(尾数)位。 在 float 或 double 中,正无穷大用符号位 0 表示,指数位全 1,尾数位全 0。负无穷大的表示方式相同,只是符号位为 1。所以无穷大表示为两种非常相似的方式,但由于浮点数和双精度数之间的指数和尾数位的计数不同,因此位级模式不同。

出于编写代码的目的,您可以将它们视为相同。 每当您同时使用双精度数和浮点数时,除非您明确说明,否则浮点数将自动转换为双精度数并且表达式将生成双精度数,因此对于大多数实际用途而言,浮点数无穷大“表现得像”双精度无穷大。

这取决于你所说的“相同”是什么意思。 位模式不同,因为符号不同,但它们仍然是无限的。

此外,浮点数的提升规则在转换为双精度数时将保留无限性质。

在 Java 中,您不能直接将doublefloat进行比较。 相反,当您尝试这样做时, float首先会自动转换为double精度数。 当您将float传递给采用double参数的方法时,也会发生同样的事情。 当您将Float.POSITIVE_INFINITY (例如)转换为double时,您会得到Double.POSITIVE_INFINITY

所以你的问题的答案是Double.POSITIVE_INFINITYFloat.POSITIVE_INFINITY并不完全相同,但它们都表示“一个太大而无法表示的数字”,因此==给你的答案在逻辑上是一致的。

没有办法比较 Java 中的floatdouble精度数。 在将float隐含地向上转换为double后,您可能使用的所有操作都将doubledouble进行比较

 float f= 
 double d =
 Double.compare(f, d);
 // equivelent to
 Double.compare((double) f, d);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM