M3 Mac 上除法结果不同?

问题描述 投票:0回答:1

假设有以下课程:

class Test {
    public static void main(String[] args) {
        double result = Math.log(9) / Math.log(3);
        System.out.println(result);
    }
};

在 x86_64 Linux 机器 (

Linux 6.8.10-300.fc40.x86_64 #1 SMP PREEMPT_DYNAMIC Fri May 17 21:20:54 UTC 2024 x86_64 GNU/Linux
) 上,我得到以下结果:

2.0

在 M3 Mac 上,我得到以下信息:

2.0000000000000004

除了 JDK bug 之外,对这种行为还有哪些可能的解释? 两台机器上使用的JDK版本都是

Temurin-21.0.3+9

java math
1个回答
5
投票

功能,而不是错误

Math
类指出了这一警告:

StrictMath
类的一些数值方法不同,
Math
类的等效函数的所有实现都未定义为返回逐位相同的结果。这种放宽允许在不需要严格再现性的情况下实现更好的性能。

这意味着实施可能会有少量变化。所以这不是一个错误。

那么你必须考虑浮点运算。我们可以做真正的算术,

log(9)/log(3) = log(3^2)/log(3) = 2 log(3)/log(3) = 2

Java 不会为您进行这些减少,它将计算 log(9),它没有非终止的精确二进制表示。然后log(3)然后进行除法。因此,存在一些近似值。

© www.soinside.com 2019 - 2024. All rights reserved.