Java浮点高精度库
哪些Java库适合浮点运算或定点运算,精度高达数千位? 他们有多高性能?
对我的一个要求是,它实现了一个乘法algorithm,它比原来的乘法algorithm要好4倍的倍数 (比较乘法algorithm )2倍的数字。
在Arbitrary Precision Arithmetic页面上提到了三个库:java.math(包含提到的BigDecimal), Apfloat和JScience 。 我运行一些速度检查他们只是使用加法和乘法。
结果是,对于相对较less的数字BigDecimal是可以的(一半的速度比其他人快1000倍),但是如果你使用更多的数字,它的方式是closures的 – JScience快了大约4倍。 但明显的performance赢家是Apfloat。 其他库似乎使用天真的乘法algorithm,其时间与数位的平方成正比,但Apfloat的时间似乎几乎线性增长。 在10000位数字上是JScience的4倍,但在40000位数字上是JScience的16倍。
另一方面:JScience为math问题提供了卓越的function:matrix,向量,符号algorithm,方程系统的解决scheme,以及什么不是。 所以我可能会和JScience一起去写封装,把Apfloat整合到JScience的algorithm中 – 由于好的devise,这似乎很容易实现。
(更新:我为JScience的数字包编写了一个testing套件,并修复了一些bug,这个版本进入了4.3.1版本,所以我可以推荐检查一下。
你有没有检查BigDecimal的性能? 我在JavaDoc中看不到任何明显的东西,但它肯定会成为我的第一个通话端口。
你可以看看JScience图书馆和他们的实数类。 我不确定性能如何与BigDecimal相关,但是图书馆的目标是为科学应用提供高度调整的类,这似乎是一个好兆头。
Apfloat提供了高精度的尾数,但似乎给指数的精度要低于正常值(基于事实上,对于double可以处理的值,它的“对数为零”)。 所以对大数字没有用处。
另外,文档说:
“构造函数Apfloat(float,long)和Apfloat(double,long)存在一个缺陷,由于浮点数和双精度值都以2为基数在内部表示,转换到其他任何基数通常会导致舍入错误,导致apfloat将不准确到所需的位数。
例如,0.3不能精确地以2为基数表示。当你像新的Apfloat(0.3f,1000)一样构造一个apfloat时,结果数字不会精确到1000位,而只能是大约7位数10)。 事实上,由此产生的数字将是像0.30000001192092896 …“
这似乎使Apfloat最低限度有用。
BigDecimal没有对数函数,并且文档没有说明是否允许您创build大于双精度的数字; 指数是32位的。