2016-07-30 421 views
2

通常會說「SAS缺失值等於負無窮大」。但是這個陳述存在問題,因爲缺失值可能有27或28個「風味」(缺省值..a.z._),每個都有一個預定義的排序順序。SAS如何區分缺失值和缺失值?

因爲它不能是無窮的一些人比其他人更大,我才明白:

  1. 缺失值像對待負無窮相比,有效的數字數據時,這
  2. 與其他缺失值進行比較時,它們會與另一組預定義規則進行排名。

所以我的問題是:在最低級別,SAS如何存儲數值數據,以便能夠區分缺失值和非缺失值?有沒有「缺失位」就像有一個「符號位」?

+0

它實際上並沒有明確地存儲負無窮大,在內存中。它只是在操作中被視爲負無窮。如果有多個缺失值,它基本上會根據缺失值的類型打破平局。 – Carl

+0

有些無限大於其他。嘗試計算每個自然數與[0,1]中的每個實數進行計數。 – Carl

+0

不在計算機上測試,但我相信所有數字都是雙精度值,甚至是缺失值。我認爲它們代表IEEE雙精度浮點表示中的最後27(或28)個整數。是'.'>還是<'._'? – DomPazz

回答

3

SAS將數字存儲爲使用64位IEEE格式的浮點值。他們挑選了28個特定的位組合,並用它們來表示。,._和.a到.z。按照慣例,他們被定購。到.a到.z。我不確定是否選擇了這些值是爲了更容易測試該順序,或者如果排序是他們使用的特定位模式的事故。

您可以查看通過查看存儲的值所使用的位模式。

data _null_; 
    length i 8 str $8 ; 
    do i=._,.,.a,.z,constant('small'),0,1,constant('big'); 
    str=peekclong(addrlong(i)); 
    str=reverse(str); 
    put i best12. @15 i hex16. @35 str $hex16. ; 
    end; 
run; 

結果

  _     _ FFFFFF0000000000 
      .     . FFFFFE0000000000 
      A     A FFFFFD0000000000 
      Z     Z FFFFE40000000000 
2.22507E-308 0010000000000000 0010000000000000 
      0 0000000000000000 0000000000000000 
      1 3FF0000000000000 3FF0000000000000 
1.797693E308 7FEFFFFFFFFFFFFF 7FEFFFFFFFFFFFFF 
+0

那麼,如果你刪除你的兩個第一句(我相信你可以弄清楚爲什麼我說這個),我可能會接受這個答案。 –

+1

第一句是迴應問題的第一段。 – Tom

+1

我回答了這個問題。 – Tom