Java浮点高精度库

时间:2008-11-10 07:45:18

标签: java floating-point

哪些Java库可以快速实现浮点或定点操作,精度为几千位?他们的表现如何?

对我来说,一个要求是它实现了一个比天真乘法算法更好的乘法算法,这个算法花费的时间是2倍大数字的4倍(比较Multiplication algorithms)。

4 个答案:

答案 0 :(得分:40)

Arbitrary Precision Arithmetic页面上提到了三个库:java.math(包含提到的BigDecimal),ApfloatJScience。我对它们运行一点速度检查,它只使用加法和乘法。

结果是,对于相对较少的数字,BigDecimal是正常的(1000个数字的其他数字的一半),但是如果你使用更多的数字,那么它就离开了 - JScience的速度提高了大约4倍。但明显的表现赢家是Apfloat。其他库似乎使用天真的乘法算法,其时间与数字的平方成正比,但Apfloat的时间似乎几乎呈线性增长。在10000位数上,它的速度是JScience的4倍,但在40000位数上,它的速度是JScience的16倍。

另一方面:JScience为数学问题提供了优秀的功能:矩阵,向量,符号算法,方程系统的解决方案以及其他方法。因此,我可能会选择JScience,然后编写一个包装器将Apfloat集成到JScience的算法中 - 由于设计良好,这似乎很容易实现。

(更新:我为JScience的数字包写了一个测试套件并修复了一些错误。这进入了4.3.1版本。所以我建议你查看它。)

答案 1 :(得分:6)

您是否检查了BigDecimal的效果?我在JavaDoc中看不到任何明显的东西,但它肯定是我的第一个停靠点。

答案 2 :(得分:3)

您可以查看JScience库及其Real号码类。我不确定性能是如何与BigDecimal相关的,但该库的目标是为科学应用程序提供高度调整的类,这似乎是一个好兆头。

答案 3 :(得分:-3)

Apfloat在尾数上提供了高精度,但似乎在指数上给出了低于通常的精度(基于它对于双重可以处理的值以“对数为零”崩溃的事实)。所以它对大数字没用。

此外,文档说:

“构造函数Apfloat(float,long)和Apfloat(double,long)存在陷阱。由于浮点数和双精度数总是在基数2内部表示,因此转换为任何其他基数通常会导致舍入错误,并且生成的apfloat将无法精确到所需的位数。

例如,0.3无法准确呈现在基数2中。当您构造像新Apfloat(0.3f,1000)这样的apfloat时,结果数字将不准确到1000位数,但仅限于大约7位数(在基数10中)。事实上,结果数字将类似于0.30000001192092896 ......“

这似乎使Apfloat最低限度有用。

BigDecimal没有对数函数,文档中没有说明它是否允许你制作比双精度更大的数字;指数是32位,类似。