SAS 如何区分缺失值和非缺失值?

How does SAS distinguish missing from non-missing values?

俗称"SAS missing values equal minus infinity"。但是该语句存在问题,因为可以有 27 或 28 "flavors" 个缺失值(默认 ..a.z._ ), 每个都有一个预定义的排序顺序。

既然某些无穷大不可能比其他无穷大,我开始明白:

  1. 与有效数值数据相比,缺失值被视为减去无穷大,
  2. 与其他缺失值相比,它们根据另一组预定义规则进行排名。

所以我的问题是:在最低级别,SAS 如何以能够区分缺失值和非缺失值的方式存储数值数据?有没有像有"sign bit"一样的"missingness bit"?

SAS 使用 64 位 IEEE 格式将数字存储为浮点值。他们选择了 28 个特定的位组合,并用它们来表示 .、._ 和 .a 到 .z。按照惯例,它们被命令 ._ 到 .到 .a 到 .z。我不确定是否选择这些值是为了更容易测试该排序,或者该排序是否是他们使用的特定位模式的意外。

您可以通过查看存储的值来查看使用的位模式。

data _null_;
  length i 8 str  ;
  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