如何在Clojure中获得精确的大数算术结果?

aga*_*gam 2 clojure common-lisp

(这可能是一个愚蠢的问题,但......)

在Common Lisp中,我可以做类似的事情

CL-USER> (expt 2 63)
9223372036854775808
Run Code Online (Sandbox Code Playgroud)

我为Clojure尝试了一些替代方案:

user> (Math/pow 2 63)
9.223372036854776E18
Run Code Online (Sandbox Code Playgroud)

显然,胁迫int不起作用:

user> (int (Math/pow 2 63))
IllegalArgumentException Value out of range for int: 9.223372036854776E18  clojure.lang.RT.intCast (RT.java:1211)
Run Code Online (Sandbox Code Playgroud)

所以我试着强迫bigint:

user> (bigint (Math/pow 2 63))
9223372036854776000N
Run Code Online (Sandbox Code Playgroud)

......但那也没有用.

获得与上述相同结果的推荐方法是什么?(谢谢!)

cfr*_*ick 5

您可以使用powfrom BigDecimal:

user=> (.pow (bigdec 2) 63)
9223372036854775808M
Run Code Online (Sandbox Code Playgroud)

至于处理bigdec/bigint Clojure,有一个带有尾随'(例如*')的"自动提升"计算功能.对于其他操作,Java interop始终是一个选项或第三方库,如https://github.com/clojure/math.numeric-tower