SAS 如何区分缺失值和非缺失值?
How does SAS distinguish missing from non-missing values?
俗称"SAS missing values equal minus infinity"。但是该语句存在问题,因为可以有 27 或 28 "flavors" 个缺失值(默认 .
和 .a
到 .z
和 ._
), 每个都有一个预定义的排序顺序。
既然某些无穷大不可能比其他无穷大,我开始明白:
- 与有效数值数据相比,缺失值被视为减去无穷大,
- 与其他缺失值相比,它们根据另一组预定义规则进行排名。
所以我的问题是:在最低级别,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
俗称"SAS missing values equal minus infinity"。但是该语句存在问题,因为可以有 27 或 28 "flavors" 个缺失值(默认 .
和 .a
到 .z
和 ._
), 每个都有一个预定义的排序顺序。
既然某些无穷大不可能比其他无穷大,我开始明白:
- 与有效数值数据相比,缺失值被视为减去无穷大,
- 与其他缺失值相比,它们根据另一组预定义规则进行排名。
所以我的问题是:在最低级别,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