Clojure中的任意精度指数运算

10

在Clojure中有没有一种方法可以进行任意精度的指数运算?我尝试过Math/pow和clojure.math.numeric-tower中的expt函数,但两者都只返回有限的精度。例如:

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

我该如何获得更多数字?


1
你想要多少位数字?sqrt(2)不能表示为有限两个数字的分数。你需要一个懒惰列表来显示这些数字吗? - Dmytro Sirenko
3
我尝试使用 "with-precision" 来获取100个数字,但正如你所看到的那样,它没有起到作用。答案是:我想指定精度。expt函数可以接受bigdec参数,但只返回有限精度的结果。 - Lee Phillips
2个回答

4

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,而不是BigDecimal,因此忽略了您的“with-precision”语句:
如果底数是精确数并且指数是整数,则返回精确数;否则返回double。
user> (type (with-precision 100 (math/expt 2M 1/2)))
java.lang.Double

这段文字的意思是:“这个问题的答案似乎涵盖了如何从BigDecimal指数运算中获得任意精度。BigDecimal似乎没有提供这种‘开箱即用’的功能。”

1
那么,OP正在寻找的函数是什么? - Matt Fenwick

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接