Java 中 Math.exp 函数的局限性

Posted

技术标签:

【中文标题】Java 中 Math.exp 函数的局限性【英文标题】:Limitation of Math.exp Function in Java 【发布时间】:2017-03-01 10:15:06 【问题描述】:

我正在实现一个算法,其中我需要高十进制精度,所以我使用 BigDecimal 但 Math.exp 只接受双精度参数。

值在运行时生成并作为参数传递给 Math.exp 即

BigDecimal mathEx = new BigDecimal( Math.exp(xMulXPoint5.doubleValue()));
Where xMulXPoint5 = -347222407183165.419208175

mathEx 结果值太小以至于结果显示为零而不是实际的小值。

任何人都可以建议任何其他方法来解决这个问题。

【问题讨论】:

即使是 wolfram alpha 也不想计算这个。你打算用它做什么,只用它的日志来表示它可以吗?例如,如果您要将它乘以一个非常大的值,那么您可以将两者的对数相加,并希望得到一个更可行的数字。 【参考方案1】:

您可以使用 BigDecimal 定义自己的 exp 函数,然后使用它,而不是 Math.exp

我找到了这个。也许这个帖子会有所帮助

BigDecimal Euler's number calculation to emulate Math.exp(double a)

希望对你有帮助

【讨论】:

如果您可以添加自己的解释和/或示例代码会更好,而不是仅仅发布链接,因为链接可能会变得陈旧等,因此这个答案可以在很大程度上独立存在。发布链接可以作为参考或补充阅读。 不幸的是,它不会这样做,因为结果下溢指数:它大约是 -1.5E14,不能用 32 位 int 表示(BigDecimal 使用它来表示它的规模) 感谢您的建议,xlm 是的,我同意我们需要注意我们需要获得多少精度。谢谢你提醒。哈罗德

以上是关于Java 中 Math.exp 函数的局限性的主要内容,如果未能解决你的问题,请参考以下文章

练习在Java中使用长构造函数是一个好习惯吗?

计算机程序的思维逻辑 (37) - 泛型 (下) - 细节和局限性

java中的char函数怎么用

Java一般排序方法,有一定的局限性。

Java8基础知识泛型的约束与局限性

synchronized 的局限性 与 Lock 的优点