Java双十进制三角法

Java双十进制三角法,java,precision,trigonometry,bigdecimal,Java,Precision,Trigonometry,Bigdecimal,我正在开发一个数学解析器,它能够计算字符串,比如'5+b*sqrt(c^2)。我正在使用ANTLR进行解析,并取得了良好的进展。现在我对Java类BigDecimal产生了兴趣,我想:嘿,为什么不在这里考虑精度呢 我的问题是JavaAPI没有为BigDecimals提供三角函数方法,比如Java.lang.Math。你知道有没有像ApacheCommons这样的好的数学库来处理这个问题吗 另一个问题是如何实现幂法,以便我可以用BigDecimals计算4.9^1.4。这可能吗 关于数值计算的书籍

我正在开发一个数学解析器,它能够计算字符串,比如
'5+b*sqrt(c^2)
。我正在使用ANTLR进行解析,并取得了良好的进展。现在我对Java类
BigDecimal
产生了兴趣,我想:嘿,为什么不在这里考虑精度呢

我的问题是JavaAPI没有为
BigDecimal
s提供三角函数方法,比如
Java.lang.Math
。你知道有没有像ApacheCommons这样的好的数学库来处理这个问题吗

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


关于数值计算的书籍请求也很感谢。

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


这些可以用任意精度的数字进行近似,但精确值不能存储在
BigDecimal
中。这不是他们真正的目的。如果你在近似某个东西,你也可以使用一个
double

几乎最好的数值计算书籍应该是是一个包含任意精度的三角函数近似和非整数幂函数近似的库;但是,它使用自己的内部表示,而不是
BigDecimal
biginger
。我以前没有使用过它,所以我不能保证它的正确性或性能特征,但api似乎相当完整。

使用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混合编写的。它的速度和准确性仍在进行中。该代码目前在上是开源的。

大数学库为BigDecimal提供了所有标准的高级数学函数(pow、sqrt、log、sin等)


为什么要使用BigDecimal?double还不够好吗?BigDecimal通常用于精确的货币计算。你肯定双不会得到你需要去的地方吗?如果便携性很重要,那么就考虑StuttFP。(不过可能会让浮点运算速度慢一点——我从来没有真正做过基准测试)只针对best的一些定义可能是最广泛的,但总是对照其他来源检查算法,并且永远不要直接使用实现-至少如果他们没有使用未定义的行为更新C版本中基于1的索引。我自己刚刚找到它,并且看到它支持我需要的几乎所有东西。如果一切都是近似的,但大小是固定的,我会通知你。大小数可以使用更多位。
BigDecimal
是近似值;这就是为什么如果您尝试执行
BigDecimal.ONE.divide(BigDecimal.valueOf(3))
,您会得到一个
java.lang.arithmetricException:非终止十进制扩展;没有可精确表示的十进制结果。
终止方程式可以正常工作,但对于非终止方程式,必须指定任意精度。当我将精度设置为1074位小数时,此库非常适合填充精确的双精度值,它是Java原语双精度值负指数的最大绝对值。我认为不需要1074位小数。IEEE 754 binary64中定义的类型double相当于MathContext.DECIMAL64,尾数精度为16位。要准确计算双精度值,我将使用MathContext.DECIMAL128(34位)。请记住,精度与小数点后的数字不同。在此上下文中,精度指有效位数。