(这可能是一个愚蠢的问题,但...)如何在Clojure中获得精确的大数运算结果?
Common Lisp中,我可以这样做
CL-USER> (expt 2 63)
9223372036854775808
我尝试了Clojure的几个备选方案:
user> (Math/pow 2 63)
9.223372036854776E18
显然,强制到int
没有工作:
user> (int (Math/pow 2 63))
IllegalArgumentException Value out of range for int: 9.223372036854776E18 clojure.lang.RT.intCast (RT.java:1211)
所以我试图强迫到bigint
:
user> (bigint (Math/pow 2 63))
9223372036854776000N
...但是,这也不能工作。
建议如何获得与上面相同的结果? (谢谢!)
谢谢!那么'bigdec'比'bigint'更习惯吗? (直觉上我会期望后者,因为它位于'clojure.lang'命名空间) – agam
你得到一个带'bigint'的'clojure.lang/BigInt',但是'bigdec'的'java.math/BigDecimal'。您可能会发现其中一个更方便,这取决于您对JDK的暴露程度。对于一个BigInteger(JDK所具有的功能),它已经比较笨拙了:'(.pow(java.math.BigInteger。“2”)63)' – cfrick