Java BigDecimal三角法

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

我的问题是Java API没有为java.lang.MathBigDecimal提供三角函数方法。 你知道是否有像Apache Commons这样的好的数学库可以解决这个问题吗?

其他问题是如何实现幂方法,以便我可以用BigDecimal s计算4.9 ^ 1.4。 这可能吗?

关于数值计算的书籍请求也受到赞赏。

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

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

这些可以用任意精度数近似,但精确值不能存储在BigDecimal 。 这不是他们真正想要的。 如果你无论如何都是近似的东西,你也可以使用double

使用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上的开源代码。

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

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

几乎所有关于数值计算的书都是数字计算