有没有办法在 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
可能不是您要查找的函数,因为它在这种情况下返回 double 而不是 BigDecimal,因此忽略您的with-precision
声明:
如果底数是精确数且幂是整数,则返回精确数,否则返回双精度数。
user> (type (with-precision 100 (math/expt 2M 1/2)))
java.lang.Double
这个问题的答案似乎涵盖了如何从 BigDecimal 求幂中获得任意精度。BigDecimal 似乎没有提供这种“开箱即用”