我需要編寫一個函數來檢測傳入它的數字何時未定義。在ocaml頂層,我發現了一些有趣的東西。=和==之間的區別以及nans的比較
nan = nan;;
這會蒸發爲假。但後來我發現了更奇特的東西
nan == nan;;
評估爲true。 =和==之間有什麼區別,以及爲什麼當比較兩個nans時第一個比較返回false?
我需要編寫一個函數來檢測傳入它的數字何時未定義。在ocaml頂層,我發現了一些有趣的東西。=和==之間的區別以及nans的比較
nan = nan;;
這會蒸發爲假。但後來我發現了更奇特的東西
nan == nan;;
評估爲true。 =和==之間有什麼區別,以及爲什麼當比較兩個nans時第一個比較返回false?
作爲@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
NaN被指定爲不同的任何號碼,包括本身。這是因爲它可能有幾個表示。
您的==在這裏工作,因爲它驗證這兩個值共享相同的內存區域。如果您從計算中「生成」NaN,情況就不會如此。
檢測到您的變量的南岬可與微小的功能,正確的做法:
let is_nan x = FP_nan = classify_float x
IEEE定義了'NaN'不等於其它任何號碼,包括本身。 – 2014-10-26 17:19:43