2014-10-26 66 views
2

我需要編寫一個函數來檢測傳入它的數字何時未定義。在ocaml頂層,我發現了一些有趣的東西。=和==之間的區別以及nans的比較

nan = nan;; 

這會蒸發爲假。但後來我發現了更奇特的東西

nan == nan;; 

評估爲true。 =和==之間有什麼區別,以及爲什麼當比較兩個nans時第一個比較返回false?

+5

IEEE定義了'NaN'不等於其它任何號碼,包括本身。 – 2014-10-26 17:19:43

回答

5

作爲@Colonel三十二說,NaN的標準行爲不等於自己。 (這是否是一個好主意,是一個獨立的辯論。)

這不是真的,NaN值總是等於物理:

# let x = 0.0 /. 0.0;; 
val x : float = nan 
# x == nan;; 
- : bool = false 

物理平等==是一個棘手和實現相關的概念。粗略地說,它測試的價值共享,這應該是不可檢測的不可變的價值,如nan。如果你確切地知道你在做什麼,你只能在你的程序中使用它。

更新

可以使用compare測試楠:

# let is_nan x = compare x nan = 0;; 
val is_nan : float -> bool = <fun> 
# is_nan nan;; 
- : bool = true 
# is_nan (1.0 /. 0.0);; 
- : bool = false 
# is_nan (0.0 /. 0.0);; 
- : bool = true 
3

NaN被指定爲不同的任何號碼,包括本身。這是因爲它可能有幾個表示。

您的==在這裏工作,因爲它驗證這兩個值共享相同的內存區域。如果您從計算中「生成」NaN,情況就不會如此。

檢測到您的變量的南岬可與微小的功能,正確的做法:

let is_nan x = FP_nan = classify_float x 
相關問題