2017-02-16 52 views
2

爲什麼下面的Clojure代碼打印「true」?Clojure在大整數上的數學/ sqrt精度

(請注意,這些數字在最後一個數字不同)

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

不知道這個問題,即是否只有約Clojure的,或者如果它也適用於其他語言(Java的BigInteger的?)。

打印它們導致:

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

1.01254725055E11 1.01254725055E11 
+1

您是否嘗試單獨在兩個數字上打印sqrt操作的結果?看起來他們可能會失去足夠的精確度,就像在有限的精度下看到的那樣。 – Brick

+3

Math.sqrt使用double,只有15位數的精度。比這更多的數字可以用'double'精度查看樣本。 –

+3

我不知道Clojure,但'Math/sqrt'幾乎可以肯定的是在調用底層平方根操作之前將其參數轉換爲雙精度。作爲雙打,你給出的* input *值都是相同的(因此當然輸出也是如此)。 –

回答

5

Java的Math.sqrt功能

  • 需要double參數和
  • 返回double結果。

由於各種意見的建議,這種誘導的轉換失去了區分數字的精度。事實上,轉換到double這樣做:

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

double一個具有53位精度。由於10位大約是3位十進制數字,所以這是大約16位十進制數字的精度。您的號碼長度爲23位,因此最後幾位數字在轉換中丟失。