2013-04-21 32 views
3

我有一些算法因爲某種原因吐出NaN,我都希望只是暫時過濾掉這些不好的結果,稍後再去找出問題所在。因此,我需要檢查一個值是NaN,我該怎麼做?檢查clojure中的NaN

我想我可以使用的伎倆,一個楠唯一的價值不等於本身,所以我寫了下面的功能

(defn NaN? 
    "Test if this number is nan" 
    [x] 
    ; Nan is the only value for which equality is false 
    (false? (= x x))) 

如果我問(NaN? Double/NaN Double/NaN這工作)。但是,如果NaN值處於某種數據結構(如同情況),並且已經準備好在某種意義上進行評估,那麼這是行不通的。例如

(def test Double/Nan) 
(NaN? test) 

返回false。

+1

(number?Double/NaN)=> true - 呵呵! – Hendekagon 2013-04-22 04:55:13

+0

確實!這就是我的原始代碼。 – zenna 2013-04-22 08:56:52

回答

6

沒有什麼錯誤使用這些測試的Java靜態功能,嘗試。

(Double/isNaN x) 

正如您所發現的NaN不等於任何東西,包括自己,如果你想忽略NaN的平等,你可以刪除,更換(見clojure.walk/prewalk替換),或測試它們值明確地,例如。

(let [nan? #(and (number? %) (Double/isNaN %)) 
     vec-data [1 Double/NaN] 
     map-data {:a 1 :b Double/NaN}] 

    [;; compare vectors without NaN values 
    (= (remove nan? vec-data) (remove nan? vec-data)) 

    ;; check that all differences in 2 maps are nan? 
    (every? nan? (mapcat vals (take 2 (clojure.data/diff map-data map-data))))]) 

    ;; => [true true] 
0

下使用==的做到了

(defn NaN? 
    "Test if this number is nan" 
    [x] 
    ; Nan is the only value for which equality is false 
    (false? (== x x))) 

而且更簡單地說,我們可以只使用雙人/ isNaN