我正在开发一个能够像'5+b*sqrt(c^2)'
一样评估字符串的数学解析器。我正在使用ANTLR进行解析并取得良好进展。现在我摔倒了Java类BigDecimal
并且想:嘿,为什么不在这里考虑精度。
我的问题是Java API不为BigDecimal
提供java.lang.Math
的三角方法。你知道是否有像Apache Commons这样的好的数学库可以解决这个问题吗?
其他问题是如何实现幂方法,以便我可以用BigDecimal
s计算4.9 ^ 1.4。这可能吗?
关于数值计算的书籍请求也很受欢迎。
答案 0 :(得分:8)
ApFloat是一个包含三角函数和非整数幂的任意精度近似的库;但是,它使用自己的内部表示,而不是BigDecimal
和BigInteger
。我之前没有使用它,所以我不能保证它的正确性或性能特征,但api似乎相当完整。
答案 1 :(得分:7)
BigDecimal
不提供这些方法,因为BigDecimal
会对有理数进行建模。三角函数,平方根和非整数的幂(我猜包括平方根)都会产生无理数。
这些可以用任意精度数近似,但确切的值不能存储在BigDecimal
中。这不是他们真正想要的。如果你无论如何都要接近某些东西,你也可以使用double
。
答案 2 :(得分:1)
使用Java BigDecimals的现有特性,即允许有限精度算术here,我最近为这些数字对象实现了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上的开源代码。
答案 3 :(得分:1)
big-math库为BigDecimal提供所有标准的高级数学函数(pow,sqrt,log,sin,...)。
答案 4 :(得分:0)
关于数值计算的最好的书就是Numerical Recipes