Math.exp()的Java实现

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

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

这怎么可能?相反,我希望有一个完美的匹配。

java c floating-point exp
1个回答
0
投票

您没有正确使用 fdlibm 库。

__ieee754_exp
就是他们所说的“基本函数”,换句话说,它是真正的
exp
函数使用的内部函数。此外,该库是多平台的,做了很多位调整,并且对 CPU 字节序非常敏感。

要正确使用该库,您需要根据 readme 中的说明构建它,然后将构建的库包含在您的应用程序中。请勿直接致电

__ieee754_exp

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