Java BigDecimal三角法

时间:2010-01-31 21:51:00

标签: java precision trigonometry bigdecimal

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

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

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

关于数值计算的书籍请求也很受欢迎。

5 个答案:

答案 0 :(得分:8)

ApFloat是一个包含三角函数和非整数幂的任意精度近似的库;但是,它使用自己的内部表示,而不是BigDecimalBigInteger。我之前没有使用它,所以我不能保证它的正确性或性能特征,但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,...)。

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

答案 4 :(得分:0)

关于数值计算的最好的书就是Numerical Recipes