23

数千桁の精度で浮動小数点または固定小数点演算を高速に実装するJava用のライブラリはどれですか?彼らはどのくらいのパフォーマンスを発揮しますか?

私の要件は、2倍の桁数で4倍の時間がかかる単純な乗算アルゴリズムよりも優れた乗算アルゴリズムを実装することです(乗算アルゴリズムと比較してください)。

4

4 に答える 4

40

Arbitrary Precision Arithmeticページには、java.math(前述のBigDecimalを含む)、Apfloat、およびJScienceの3つのライブラリが記載されています。足し算と掛け算だけを使って、少しスピードチェックをします。

その結果、比較的少数の桁の場合はBigDecimalで問題ありませんが(1000桁の場合は他の半分の速度)、より多くの桁を使用する場合はかなりオフになります。JScienceは約4倍高速です。しかし、明らかにパフォーマンスの勝者はApfloatです。他のライブラリは、桁数の2乗に比例する時間を要する単純な乗算アルゴリズムを使用しているようですが、Apfloatの時間はほぼ直線的に増加しているようです。10000桁では、JScienceの4倍の速さでしたが、40000桁では、JScienceの16倍の速さでした。

一方、JScienceは、行列、ベクトル、シンボリックアルゴリズム、連立方程式の解法など、数学の問題に優れた機能を提供します。したがって、おそらくJScienceを使用し、後でラッパーを作成してApfloatをJScienceのアルゴリズムに統合します。優れた設計により、これは簡単に可能と思われます。

(更新:JScienceのnumberパッケージのテストスイートを作成し、いくつかのバグを修正しました。これはリリース4.3.1に移行しました。したがって、チェックアウトすることをお勧めします。)

于 2008-11-12T16:53:55.713 に答える
7

BigDecimalのパフォーマンスを確認しましたか?JavaDocには明らかなものは何もありませんが、それは確かに私の最初の呼び出しポートになります。

于 2008-11-10T07:50:13.160 に答える
3

JScienceライブラリとその実数クラスを見ることができます。パフォーマンスが BigDecimal と比較してどうなのかはわかりませんが、このライブラリの目標は科学アプリケーション向けに高度に調整されたクラスを提供することであり、これは良い兆候のように思えます。

于 2008-11-10T23:36:03.937 に答える
-3

Apfloat は仮数部で高い精度を提供しますが、指数部で通常より低い精度を与えるようです (double が処理できる値の「ゼロの対数」でクラッシュするという事実に基づく)。そのため、大きな数には役に立ちません。

また、ドキュメントには次のように記載されています。

「コンストラクター Apfloat(float,long) および Apfloat(double,long) には落とし穴があります。float と double は常に基数 2 で内部的に表されるため、他の基数への変換は通常、丸め誤差を引き起こし、結果として apfloat が発生します。必要な桁数まで正確ではありません。

たとえば、0.3 は基数 2 で正確に表すことはできません。 new Apfloat(0.3f, 1000) のような apfloat を作成すると、結果の数値は 1000 桁まで正確ではなく、およそ 7 桁 (基数) までしか正確ではありません。 10)。実際、結果の数値は 0.30000001192092896 のようなものになります...」

これにより、Apfloat の有用性が最小限に抑えられているようです。

BigDecimal には対数関数がありません。ドキュメントには、double よりも大きな数値を作成できるかどうかは記載されていません。指数は 32 ビットです。

于 2011-02-12T22:43:26.493 に答える