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

标签 java java-8

我查看了 Double.isFinite() 的实现从 java 8 开始就存在(因为我需要 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-package 中的常量而不是 Double.MAX_VALUE ?

(Float.isFinite 使用相同的模式)

最佳答案

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

这些方法提供的功能以前位于 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

关于java - Double.isFinite 实现细节 - 为什么是 DoubleConsts.MAX_VALUE 而不是 Double.MAX_VALUE?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46362306/

相关文章:

java - 如何在 shell 脚本中运行 Picard(生物信息学)工具时消除 Java 异常错误?

java - 有没有一种优雅的方式来分块处理流?

java - 你如何创建一个大数组?

java - 如何通过Selenium阻止chrome中的弹出窗口

java - 在按钮操作上将背景图像添加到 JPanel

Android 格式 #.# 的 Java 十进制问题

java - finish() 正在销毁我的对象

testing - @SuppressStaticInitialization 用于部分模拟

Java 8 : Reading a file into a String

java - 测试 BiConsumer 时出现编译错误