通常会说“SAS缺失值等于负无穷大”。但是这个陈述存在问题,因为缺失值可能有27或28个“风味”(缺省值.
和.a
到.z
和._
),每个都有一个预定义的排序顺序。SAS如何区分缺失值和缺失值?
因为它不能是无穷的一些人比其他人更大,我才明白:
- 缺失值像对待负无穷相比,有效的数字数据时,这
- 与其他缺失值进行比较时,它们会与另一组预定义规则进行排名。
所以我的问题是:在最低级别,SAS如何存储数值数据,以便能够区分缺失值和非缺失值?有没有“缺失位”就像有一个“符号位”?
通常会说“SAS缺失值等于负无穷大”。但是这个陈述存在问题,因为缺失值可能有27或28个“风味”(缺省值.
和.a
到.z
和._
),每个都有一个预定义的排序顺序。SAS如何区分缺失值和缺失值?
因为它不能是无穷的一些人比其他人更大,我才明白:
所以我的问题是:在最低级别,SAS如何存储数值数据,以便能够区分缺失值和非缺失值?有没有“缺失位”就像有一个“符号位”?
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
它实际上并没有明确地存储负无穷大,在内存中。它只是在操作中被视为负无穷。如果有多个缺失值,它基本上会根据缺失值的类型打破平局。 – Carl
有些无限大于其他。尝试计算每个自然数与[0,1]中的每个实数进行计数。 – Carl
不在计算机上测试,但我相信所有数字都是双精度值,甚至是缺失值。我认为它们代表IEEE双精度浮点表示中的最后27(或28)个整数。是'.'>还是<'._'? – DomPazz