在Clojure中測試兩個數字是否接近的慣用方法是什麼?如何測試Clojure中兩個數字是否接近
某處沿着線:
(deftest sqrt-test
(is (~= 1.414 (Math/sqrt 2)))
在Clojure中測試兩個數字是否接近的慣用方法是什麼?如何測試Clojure中兩個數字是否接近
某處沿着線:
(deftest sqrt-test
(is (~= 1.414 (Math/sqrt 2)))
你需要確定 「關閉」。如果你問一個小於一些寬容「差」,則可以使用<
推出自己的功能:
(defn close? [tolerance x y]
(< (difference x y) tolerance))
凡差異可能是絕對的:
(defn absolute-difference ^double [^double x ^double y]
(Math/abs (double (- x y))))
或相對:
(defn relative-difference ^double [^double x ^double y]
(/ (Math/abs (- x y))
(max (Math/abs x) (Math/abs y))))
(當然,選擇你的首選定義的相對差異)。
然後(partial close? 0.001)
將測試近似相等與容差0.001。
要發現公差參數有用值的限制,您可以使用Math/ulp
,這是一種靜態方法,它採用double並返回它與最小的較大double之間的絕對差值。
雖然我喜歡米哈爾Marczyk的溶液,請注意,已經有
在clojure.algo.generic.math函數定義的約=
功能。樣品用法:
clojuree.o=> (approx= 1.41 (sqrt 2) 1e-2)
true
clojuree.o=> (approx= 1.41 (sqrt 2) 1e-4)
false