NaN

不能被描述的值

NaNNot a Number,非數)是計算機科學中數值數據類型的一類,表示未定義或不可表示的。常在浮點數運算中使用。首次引入NaN的是1985年的IEEE 754浮點數標準。

浮點數

編輯

在浮點數運算中,NaN與無窮大的概念不同,儘管兩者均是以浮點數表示實數時的特殊值。無效操作(Invalid Operation)同樣也不同於算術溢出(可能返回無窮大)和算術下溢出(可能返回最小的一般數值、特殊數值、零等)。

IEEE 754-1985中,用指數部分全為1、小數部分非零表示NaN。以32位IEEE單精度浮點數的NaN為例,按位表示即:S111 1111 1AXX XXXX XXXX XXXX XXXX XXXX,S為符號位,符號位S的取值無關緊要;A是小數部分的最高位(the most significant bit of the significand),其取值表示了NaN的類型:小數部分不能全為0,小數部分除了A之外的部分被稱為NaN的payload;[註 1]

  • 大多數處理器,包括IntelAMDx86系列、Motorola 68000系列英語Motorola 68000 seriesAIM PowerPC系列、ARM系列、Sun SPARC系列,採取了A為'is_quiet'標記位。即,如果A = 1,則該數是quiet NaN;如果A為零、其餘X部分非零,則是signaling NaN。IEEE 754-2008標準採納了這一方案。
  • PA-RISCMIPS處理器,採取了A為'is_signaling'標記位。恰與上述相反。

與NaN值的比較

編輯

IEEE 754標準定義了NaN值的比較方式。對兩個浮點數作比較時,認為NaN是一個無順序的、與任何數值都不相等的數值,而且會忽略NaN值中的符號位。

當NaN與另一個浮點數x(其中x可為正常值、正負無窮大或NaN)進行比較時,比較結果如下:

比較 NaN ≥ x NaN ≤ x NaN > x NaN < x NaN = x NaN ≠ x
結果 False False False False False True

由上表可知,判斷一個值是否為NaN時,不能通過判斷x=NaN或x≠NaN來進行比較,但因為NaN永遠不等於其自身,因此可通過判斷x=x或x≠x來判斷x是否為NaN值(分別返回False和True)。

返回NaN的運算

編輯

返回NaN的運算有如下三種[1]

是否返回NaN與編程語言有關。有些編程語言在進行以上運算時會引發異常,而另一些編程語言則會返回NaN值,不會引發異常或中止程序。

整數的NaN

編輯

大多數定長的整數格式無法顯式表示無效數據。

Perl的BigInt包用「NaN」來表示不含有效整數數據字符串的處理結果。

>perl -mMath::BigInt -e "print Math::BigInt->new('foo')"

NaN

注釋

編輯
  1. ^ 如果浮點數的小數部分全為零,則該數為浮點無窮大
  2. ^ 在某些編程語言中,NaN^0等於1。
  3. ^ 在某些編程語言中,0^0、∞^0和1^∞均等於1。

參考文獻

編輯

外部連結

編輯