哪些Java库可以快速实现浮点或定点操作,精度为几千位?他们的表现如何?
对我来说,一个要求是它实现了一个比天真乘法算法更好的乘法算法,这个算法花费的时间是2倍大数字的4倍(比较Multiplication algorithms)。
答案 0 :(得分:40)
Arbitrary Precision Arithmetic页面上提到了三个库:java.math(包含提到的BigDecimal),Apfloat和JScience。我对它们运行一点速度检查,它只使用加法和乘法。
结果是,对于相对较少的数字,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)
答案 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位,类似。