Java BigDecimal三角法
我正在开发一个数学解析器,它能够像'5+b*sqrt(c^2)'
一样评估字符串。 我正在使用ANTLR进行解析并取得良好进展。 现在我摔倒了Java类BigDecimal
并且想:嘿,为什么不在这里考虑精度。
我的问题是Java API没有为java.lang.Math
等BigDecimal
提供三角函数方法。 你知道是否有像Apache Commons这样的好的数学库可以解决这个问题吗?
其他问题是如何实现幂方法,以便我可以用BigDecimal
s计算4.9 ^ 1.4。 这可能吗?
关于数值计算的书籍请求也受到赞赏。
ApFloat是一个包含三角函数和非整数幂的任意精度近似的库; 但是,它使用自己的内部表示,而不是BigDecimal
和BigInteger
。 我之前没有使用它,所以我不能保证其正确性或性能特征,但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,…)。
几乎所有关于数值计算的书都是数字计算