大整数上的Clojure Math / sqrt精度

时间:2017-02-16 14:29:30

标签: java math clojure sqrt

为什么以下Clojure代码打印" true"?

(请注意,最后一位数字不同)

(== (Math/sqrt 10252519345963644753026N)
    (Math/sqrt 10252519345963644753025N))

不确定这个问题是关于Clojure还是它也适用于其他语言(Java' BigInteger?)。

打印它们导致:

(str (Math/sqrt 10252519345963644753026N) " "
     (Math/sqrt 10252519345963644753025N))

1.01254725055E11 1.01254725055E11

1 个答案:

答案 0 :(得分:6)

Java Math.sqrt函数

  • 采用double参数和
  • 返回double结果。

正如各种评论所暗示的那样,这导致的转换失去了区分数字的精确度。事实上,转换为double会这样做:

(= (double 10252519345963644753026N)
   (double 10252519345963644753025N))
;true

double具有53位精度。由于10位是大约3个十进制数字,因此大约是16位十进制数字。您的号码长度为23位,因此最后几位数字在转换时会丢失。