【问题标题】:Arbitrary precision exponentiation in ClojureClojure 中的任意精度求幂
【发布时间】:2012-12-06 00:16:37
【问题描述】:

有没有办法在 Clojure 中执行任意精度求幂?我已经尝试过 Math/pow 和 clojure.math.numeric-tower 中的 expt 函数,但两者都只会返回有限的精度。例如:

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

如何获得更多数字?

【问题讨论】:

  • 你想要多少位数? sqrt(2) 不能表示为有理数(作为两个有限数的分数)。你想要一个懒惰的数字列表吗?
  • 我试图通过使用“精确”来获得 100 位数字,但正如您所见,它什么也没做。答案是:我想指定精度。 expt 函数接受 bigdec 参数,但只返回有限精度的结果。

标签: math clojure


【解决方案1】:

math/expt 可能不是您要查找的函数,因为它在这种情况下返回双精度而不是 BigDecimal,因此忽略您的 with-precision 语句:

如果底数是精确数且幂是整数,则返回精确数,否则返回双精度数。

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

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

【讨论】:

  • 在这种情况下,OP 正在寻找的函数是什么?
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-21
    • 1970-01-01
    • 1970-01-01
    • 2014-04-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多