Double.isFinite实现细节 - 为什么DoubleConsts.MAX_VALUE而不是Double.MAX_VALUE?

时间:2017-09-22 10:16:13

标签: java java-8

我查找了自java 8以来存在的Double.isFinite()的实现(因为我需要java 7中的功能):

public static boolean isFinite(double d) {
    return Math.abs(d) <= DoubleConsts.MAX_VALUE;
}

其中DoubleConsts.MAX_VALUEdouble sun.misc.DoubleConsts.MAX_VALUE,其值为1.7976931348623157E308。这似乎等同于Double.MAX_VALUE,其定义为:

public static final double MAX_VALUE = 0x1.fffffffffffffP+1023; // 1.7976931348623157e+308

为什么此实现使用sun.misc - 包而不是Double.MAX_VALUE中的常量?

Float.isFinite使用相同的模式)

1 个答案:

答案 0 :(得分:2)

原因似乎主要是历史性的:

这些方法提供的功能以前位于sun.misc.FpUtils。该类不直接依赖于Double,它只导入

import sun.misc.FloatConsts;
import sun.misc.DoubleConsts;

因此实现更有意义 - 它似乎完全相同:

public static boolean isFinite(double d) {
    return Math.abs(d) <= DoubleConsts.MAX_VALUE;
}

另见The ticket that led to moving this to Double