2012-12-18 26 views
9

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

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

数字を増やすにはどうすればよいですか?それはこの文脈では代わりにBigDecimalのdoubleを返し、ひいては自分のwith-precision文を無視して

+1

何桁の数字を入力しますか? 'sqrt(2)'は有理数(2つの有限数の一部として)で表すことはできません。あなたは数字の怠惰なリストが欲しいですか? –

+2

"with-precision"を使用して100桁を取得しようとしましたが、何もしなかったことがわかります。答えは:精度を指定したいと思います。 expt関数はbigdec引数を受け取りますが、限定された精度の結果しか返しません。 –

答えて

3

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

[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 
2

math/exptあなたが探している機能可能性がありません:

ベースが正確であれば正確な数を返します。パワーは整数で、そうでない場合はdoubleを返します。

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

this questionへの答えは、BigDecimalの累乗のうち、任意の精度を取得する方法をカバーしているようです。 BigDecimalはこれを「すぐに」提供しないようです

+1

その場合、OPが探している機能は何ですか*ですか? –