11

我正在开发一个数学解析器,它能够像'5+b*sqrt(c^2)'. 我正在使用 ANTLR 进行解析并取得良好进展。现在我跌倒在 Java 类上BigDecimal并想:嘿,为什么不在这里考虑精度。

我的问题是 Java API 没有为BigDecimals like提供三角函数方法java.lang.Math。你知道是否有像 Apache Commons 这样的优秀数学库来处理这个问题?

另一个问题是如何实现幂法,以便我可以用BigDecimals 计算 4.9 ^ 1.4。这可能吗?

还感谢有关数值计算的书籍请求。

4

5 回答 5

7

BigDecimal不提供这些方法,因为BigDecimal模型是有理数。三角函数、平方根和非整数的幂(我猜包括平方根)都会产生无理数。

这些可以用任意精度的数字来近似,但精确值不能存储在BigDecimal. 这不是他们真正的目的。如果您无论如何都在近似某些东西,那么您也可以只使用double.

于 2010-01-31T21:54:44.507 回答
7

ApFloat是一个包含三角函数和非整数幂的任意精度逼近的库;但是,它使用自己的内部表示,而不是BigDecimaland BigInteger。我之前没有使用过,所以我不能保证它的正确性或性能特征,但是这个 api 看起来相当完整。

于 2010-01-31T22:23:55.843 回答
4

big-math 库为 BigDecimal 提供了所有标准的高级数学函数(pow、sqrt、log、sin...)。

https://github.com/eobermuhlner/big-math

于 2017-07-26T06:25:45.180 回答
0

几乎关于数值计算的最好的书是数值食谱

于 2010-01-31T22:05:46.697 回答
0

使用 Java BigDecimals 的现有功能,即允许此处描述的有限精度算术,我最近为这些数字对象实现了 sqrt/1、exp/1、tan/1 等。

数值算法本身使用 Maclaurin 和 Taylor 级数,加上适当的范围缩减以确保该级数具有足够的速度和广度。

这是一个示例计算,Ramanujan 常数:

Jekejeke Prolog 2, Runtime Library 1.1.8
(c) 1985-2017, XLOG Technologies GmbH, Switzerland

?- use_module(library(stream/console)).
% 0 consults and 0 unloads in 0 ms.
Yes

?- X is mp(exp(pi*sqrt(163)), 60).
X = 0d262537412640768743.999999999999250072597198185688879353856320

这个东西是用 Prolog 和 Java 混合编写的。它的速度和准确性仍在进行中。该代码目前在GitHub上开源。

于 2017-03-04T00:04:35.027 回答