Math.exp() 将计算委托给 StrictMath,后者又将其委托给 C 中的 fdlibm 库。至少从 https://docs.oracle.com/javase/8 中提到的内容来看,它是这样的/docs/api/java/lang/StrictMath.html.
但是,与 Java 返回的结果相比,此 C 实现 (https://www.netlib.org/fdlibm/e_exp.c) 似乎给出了不同的结果: 我正在评估
exp(-0.271153846153846134203746487401076592504978179931640625)
。
C 实现给出:
0.728846153846153921307404743856750428676605224609375
而 Java 给出:
0.76249917981481829531986704751034267246723175048828125
Java 代码就是:
double expon2 = Math.exp(-0.271153846153846134203746487401076592504978179931640625); System.out.println(new BigDecimal(expon2).toPlainString());
C 代码是(根据 https://www.netlib.org/cgi-bin/netlibfiles.pl?filename=/fdlibm/e_exp.c):
https://godbolt.org/z/f3KesxzbY
这怎么可能?相反,我希望有一个完美的匹配。
您没有正确使用 fdlibm 库。
__ieee754_exp
就是他们所说的“基本函数”,换句话说,它是真正的 exp
函数使用的内部函数。此外,该库是多平台的,做了很多位调整,并且对 CPU 字节序非常敏感。
要正确使用该库,您需要根据 readme 中的说明构建它,然后将构建的库包含在您的应用程序中。请勿直接致电
__ieee754_exp
。