Clojure中任意精度取幂

时间:2012-12-18 18:10:46

标签: math clojure

有没有办法在Clojure中执行任意精度取幂?我已经尝试过数学/战俘以及来自clojure.math.numeric-tower的expt函数,但两者都只会返回有限的精度。例如:

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

如何获得更多数字?

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:2)

math/expt可能不是您要查找的函数,因为它在此上下文中返回double而不是BigDecimal,因此忽略了您的with-precision语句:

  

如果base是精确数字且幂是整数,则返回一个确切的数字,否则返回一个double。

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

this question的答案似乎涵盖了如何从BigDecimal取幂中获取任意精度。 BigDecimal似乎没有提供这种“开箱即用”的方式