Double类中NaN、POSITIVE_INFINITY等常量取值及自赋值原理问询
Java Double类特殊常量的取值与自赋值机制详解
嘿,这个问题问到点子上了!很多人第一次看到Double类的这段源码都会懵——怎么常量还能赋值给自己?别急,咱们一步步说清楚:
一、各个常量的实际取值
这些都是IEEE 754双精度浮点数标准定义的特殊值,具体含义和取值如下:
- POSITIVE_INFINITY:正无穷大,对应数学意义上的正无穷,数值上大于任何有限的
double值,你可以通过计算1.0 / 0.0得到它。 - NEGATIVE_INFINITY:负无穷大,小于任何有限的
double值,对应-1.0 / 0.0的计算结果。 - NaN:全称Not a Number(非数值),用来表示无效的数值运算结果(比如
0.0 / 0.0或者Math.sqrt(-1))。要注意的是,NaN和任何值(包括它自己)的比较结果都是false。 - MAX_VALUE:
double类型能表示的最大有限正数值,具体值约为1.7976931348623157e+308。 - MIN_VALUE:
double类型能表示的最小正数值(不是负数的最小值),是一个极其接近0的正数,约为4.9e-324。
二、自赋值写法的实现机制
先看你贴的这段源码:
public final class Double extends Number implements Comparable<Double> { public static final double POSITIVE_INFINITY = POSITIVE_INFINITY; public static final double NEGATIVE_INFINITY = NEGATIVE_INFINITY; public static final double NaN = NaN; public static final double MAX_VALUE = MAX_VALUE; public static final double MIN_VALUE = MIN_VALUE; // ... 其他代码 }
乍一看这完全是循环定义,但实际上这是Java编译器和JVM针对特殊浮点常量做的底层特殊处理:
这些常量属于Java语言规范中预定义的特殊浮点值,编译器在编译这段代码时,并不会把右边的POSITIVE_INFINITY当成普通变量来解析,而是直接将整个字段替换为对应的IEEE 754标准的二进制常量值。
换句话说,JVM在加载Double类的时候,会直接把这些字段初始化为对应的特殊浮点值(比如正无穷对应的二进制表示),完全跳过了表面上的自赋值逻辑。这是Java为了兼容IEEE 754标准,对基础类型的核心常量做的专属优化,避免了编译和运行时的循环依赖问题。
内容的提问来源于stack exchange,提问作者Gurwinder Singh
相关产品推荐
相关产品推荐

