You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

M3 Mac与x86_64 Linux上Java浮点数运算结果差异原因排查

问题描述

假设存在如下Test类:

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版本均为Temurin-21.0.3+9,请问除JDK bug外,该现象还有哪些可能的解释?

可能的解释
  • CPU架构的浮点指令集差异:x86_64架构依赖x87或SSE/AVX系列浮点指令,而Apple M3基于ARM64架构,使用NEON指令集。不同指令集对log这类超越函数的计算逻辑、精度保留策略不同——比如x87支持80位扩展精度,中间计算时能保留更多有效位,最终截断到64位double时刚好得到精确的2.0;而ARM平台直接用64位double进行计算,中间误差累积后就出现了微小偏差。
  • JVM的平台针对性优化:JVM在不同架构上会启用不同的JIT优化策略。比如x86平台上JVM可能利用x87的扩展精度特性做计算,ARM平台则严格遵循64位double的运算规则;或者JIT编译器针对不同CPU生成的浮点运算代码细节有区别,导致结果出现细微差异。
  • 系统底层数学库实现不同:JDK的Math.log方法底层会调用操作系统提供的数学库——Linux用glibc,macOS用libsystem。这些平台库对对数函数的实现算法(比如近似多项式、查表法的组合方式)不同,计算出的log(9)和log(3)本身就存在极细微的精度差异,两者相除后这个差异被放大,最终呈现出不同的结果。
  • 系统浮点环境配置差异:Linux和macOS的系统级浮点环境初始化细节可能不同,比如舍入模式的默认设置、精度控制开关等。虽然默认都是向最近舍入,但不同系统对浮点环境的初始化逻辑可能存在细微差别,间接影响了最终的计算结果。

内容的提问来源于stack exchange,提问作者Lukáš Petrovický

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.23 13:02:05