資料表示法:位元、位元組與數值

浮點數的特殊值(零、無窮大、NaN、非正規值)

/ NaN: nan /

IEEE-754 不只儲存普通的數字;它保留了少數特殊的位元模式,用於普通數字無法處理的情況——除以零的結果、一個小到無法正常寫出的量,或一個根本沒有有意義答案的計算。認識這些特殊值,能把像「inf」或「nan」這種令人困惑的輸出,變成你能推理而非畏懼的東西。

有四個值得認識的家族。第一,「零」有兩種形式:+0.0 和 -0.0,因為符號是獨立的一個位元;它們比較起來相等,但行為可能不同(1.0 / +0.0 是 +無窮大,1.0 / -0.0 是 -無窮大)。第二,「無窮大」(+inf 和 -inf)來自溢位,或非零數除以零;它在算術上表現如你所願(inf + 1 是 inf)。第三,「NaN」,即「非數值」,是真正未定義的運算的結果,如 0.0 / 0.0、無窮大減無窮大,或負數的平方根——而 NaN 會傳染:任何涉及 NaN 的算術都產生 NaN。第四,「非正規值」(也叫 denormal)是剛好大於零的極小值;通常浮點數有那個隱含的前導 1,但對最小的量級,格式放寬了那條規則,讓值逐漸衰減到零,而非驟然歸零,這個特性叫漸進下溢。

最重要也最令人意外的單一性質是:NaN 不等於任何東西——連它自己都不等於。運算式「x == x」對每個普通的數都為真,但當 x 是 NaN 時為「假」,這其實正是測試 NaN 的標準、可攜方式(或用 isnan())。無窮大和 NaN 會在後續算術中傳播,所以早先一次糟糕的運算就能悄悄把一整個結果陣列變成 nan。而非正規值雖然正確,在某些硬體上卻可能慢得驚人,偶爾造成神祕的效能斷崖。

0.0 / 0.0 得到 NaN;1.0 / 0.0 得到 +inf。測試 NaN:一個值 n 恰好在 (n != n) 為真時是 NaN,因為 NaN 與一切(包括它自己)比較都不相等。

NaN != NaN 是可攜的 NaN 測試;inf 來自溢位或 x/0。

因為 NaN 不等於自己,對含有 NaN 的資料排序或去重複可能行為怪異,而且「if (x == NaN)」永遠不會成立——請用 isnan(x) 或 (x != x) 慣用法。

又称
infinitynot a numberdenormalssubnormal非數值