資料表示法與數字系統

非數值(NaN, not a number)

/ nan /

NaN 是「not a number(非數值)」的縮寫,是一個特殊的浮點值,意思是「這個計算的結果不是一個有效的數」。當一個運算沒有合理的數值答案時——像 0.0 除以 0.0、負數的平方根、或無窮減無窮——IEEE 754 不會讓程式當機;它產生 NaN,一種活在數系內部的錯誤旗標。可以把它想成浮點版的計算機顯示「Error」,卻讓你能繼續算下去。

NaN 有一個著名的怪性質,那是刻意而非 bug:它不等於任何東西,包括它自己。比較 NaN 等於 NaN 會算出 false。這其實是測試它最乾淨的方法:一個值是 NaN,恰好是當它不等於自己,所以「x 不等於 x」是經典的 NaN 檢查。NaN 也會傳染——幾乎任何碰到 NaN 的算術都會產生 NaN——所以一旦出現一個,它往往會擴散到整個計算、毒害最終答案,這其實有幫助,因為它讓問題現形、而非悄悄錯掉。(浮點也有帶號的無窮,正與負,用於溢出範圍的結果,例如 1.0 除以 0.0;無窮是有效的值,NaN 才是「沒有有效值」的標記。)

這為何重要:輸出裡出現 NaN,是上游發生了某種未定義之事的訊號——一個遺漏的資料值、一次糟糕的除法、一個定義域錯誤——而追查第一個 NaN 從何而來是例行的除錯工作。要記住的誠實陷阱是:NaN 打破了比較的常規——排序、相等測試與「找最大值」的邏輯,在有 NaN 時都可能出乎意料,所以處理真實量測資料的程式應該明確檢查它。

計算 0.0 / 0.0 得到 NaN,不是零、也不是無窮。接著測試 (NaN == NaN) 回傳 false——所以偵測 NaN 的慣用法是檢查一個值是否不等於自己:x != x 為真,恰好是當 x 是 NaN。

NaN 標記一個未定義的結果,且永遠不等於自己,連 NaN == NaN 都是 false。

NaN 不等於自己,所以一旦出現,相等測試、排序、最大/最小值都可能失常。它也會傳染:多數碰到 NaN 的算術都產生 NaN,這有用地讓錯誤現形。

又称
NaN非數字