Java 8/17浮点计算差异致Apache Commons最小二乘优化器不收敛问题
JDK 8与JDK 17浮点语义差异导致Apache Commons Math优化器收敛异常问题
问题背景
我们基于Java开发的科学计算流水线中,使用Apache Commons Math 3.6.1的最小二乘优化器。将环境从JDK 8(jdk8u322-b06)迁移至JDK 17(17.0.5)后,发现两者存在数值计算差异。
复现验证
通过排除数据加载、多线程等干扰因素的单元测试,可稳定复现以下现象:
- JDK 17恢复严格浮点语义后,优化器无法收敛;而JDK 8下可正常完成收敛。
- JDK 8环境中,代码的解释执行与编译执行结果也存在数值差异,所有场景的结果均完全可复现。
问题定位
已定位到Apache Commons Math的LevenbergMarquardtOptimizer类第453行代码:
- 在JDK 17中迭代至第17次时,
actRed值为0(因r == 1),进而触发第533行的ConvergenceException。 - 在JDK 8中,同位置的
actRed为微小正值,不会触发该异常。
复现步骤
切换项目pom.xml中的java.version参数为1.8或17,运行TimeSeriesModelFitterBugTest测试用例即可复现问题。
咨询问题
- 该浮点计算差异现象是否为JDK官方文档化的已知行为?
- 该问题是否属于JDK 8或JDK 17的Bug?
内容的提问来源于stack exchange,提问作者greg
相关产品推荐
相关产品推荐

