有沒有辦法在Clojure中執行任意的精確求冪?我已經嘗試了Math/pow和clojure.math.numeric-tower的expt函數,但兩者只會返回有限的精度。例如:Clojure中的任意精確求冪
(with-precision 100 (expt 2 1/2))
=> 1.4142135623730951
如何獲取更多數字?
有沒有辦法在Clojure中執行任意的精確求冪?我已經嘗試了Math/pow和clojure.math.numeric-tower的expt函數,但兩者只會返回有限的精度。例如:Clojure中的任意精確求冪
(with-precision 100 (expt 2 1/2))
=> 1.4142135623730951
如何獲取更多數字?
Apfloat for Java提供了快速的任意精度算術。如果您的項目隨Leiningen一起提供,您可以通過將以下相關性信息添加到您的project.clj
文件中來輕鬆使用它。
[org.apfloat/apfloat "1.6.3"]
您可以用Clojure使用Apfloat執行任意精度冪。例如:
user> (import '(org.apfloat Apfloat ApfloatMath))
org.apfloat.ApfloatMath
user> (-> (Apfloat. 2M 100) (ApfloatMath/pow (Apfloat. 0.5M 100)))
1.4142135623730950488016887242096980785696718753769480731766797379907324784621070388503875343276415727
math/expt
很可能不是你要找的,因爲它返回一個double,而不是一個BigDecimal,在這種情況下,因此函數忽略你的with-precision
聲明:
返回一個確切的數字,如果底座是一種精確數量和權力是一個整數,否則返回一個雙精度。
user> (type (with-precision 100 (math/expt 2M 1/2)))
java.lang.Double
答案this question似乎涵蓋如何獲得任意精度的出BigDecimal的冪。 BigDecimal似乎不提供此「開箱即用」
在這種情況下,OP所尋找的功能是什麼? –
你想要多少位數? 'sqrt(2)'不能表示爲有理數(作爲兩個有限數的一部分)。你想要一個懶惰的數字列表嗎? –
我試圖通過使用「with-precision」來獲得100位數字,但正如你所看到的那樣,什麼也沒做。答案是:我想指定精度。 expt函數接受bigdec參數,但只返回有限的精度結果。 –