10

Clojureで任意精度のべき乗を実行する方法はありますか?Math / powとclojure.math.numeric-towerのexpt関数を試しましたが、どちらも限られた精度しか返しません。例えば:

(with-precision 100 (expt 2 1/2))
=> 1.4142135623730951

どうすればより多くの桁を取得できますか?

4

2 に答える 2

4

Apfloat for Javaは、高速の任意精度演算を提供します。project.cljプロジェクトにLeiningenが付属している場合は、次の依存関係情報をファイルに追加することで簡単に使用できます。

[org.apfloat/apfloat "1.6.3"]

Apfloatを使用して、Clojureで任意精度のべき乗を実行できます。例えば:

user> (import '(org.apfloat Apfloat ApfloatMath))
org.apfloat.ApfloatMath

user> (-> (Apfloat. 2M 100) (ApfloatMath/pow (Apfloat. 0.5M 100)))
1.4142135623730950488016887242096980785696718753769480731766797379907324784621070388503875343276415727
于 2012-12-21T09:23:48.977 に答える
2

math/exptこのコンテキストではBigDecimalではなくdoubleを返すため、探している関数ではない可能性があります。したがって、with-precisionステートメントは無視されます。

底が正確な数で、累乗が整数の場合は正確な数を返し、それ以外の場合は倍精度浮動小数点数を返します。

user> (type (with-precision 100 (math/expt 2M 1/2)))
java.lang.Double

この質問への答えは、BigDecimal指数から任意精度を取得する方法をカバーしているようです。BigDecimalは、この「箱から出してすぐに」提供しないようです

于 2012-12-18T19:35:34.653 に答える