Clojureで任意精度のべき乗を実行する方法はありますか?Math / powとclojure.math.numeric-towerのexpt関数を試しましたが、どちらも限られた精度しか返しません。例えば:
(with-precision 100 (expt 2 1/2))
=> 1.4142135623730951
どうすればより多くの桁を取得できますか?
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
math/expt
このコンテキストではBigDecimalではなくdoubleを返すため、探している関数ではない可能性があります。したがって、with-precision
ステートメントは無視されます。
底が正確な数で、累乗が整数の場合は正確な数を返し、それ以外の場合は倍精度浮動小数点数を返します。
user> (type (with-precision 100 (math/expt 2M 1/2)))
java.lang.Double
この質問への答えは、BigDecimal指数から任意精度を取得する方法をカバーしているようです。BigDecimalは、この「箱から出してすぐに」提供しないようです