大整数上的Clojure Math/sqrt精度

Ioa*_*nna 3 java math clojure sqrt

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

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

(== (Math/sqrt 10252519345963644753026N)
    (Math/sqrt 10252519345963644753025N))
Run Code Online (Sandbox Code Playgroud)

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

打印它们会导致:

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

1.01254725055E11 1.01254725055E11
Run Code Online (Sandbox Code Playgroud)

Thu*_*ail 6

Java Math.sqrt函数

  • 采取double论据和
  • 返回double结果.

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

(= (double 10252519345963644753026N)
   (double 10252519345963644753025N))
;true
Run Code Online (Sandbox Code Playgroud)

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