为什么队伍不同?

时间:2013-10-05 05:49:42

标签: sas

一:

data have;
input x1 x2;
diff=x1-x2;
a_diff= round(abs(diff), .01);
* a_diff=abs(diff);
cards;
50.7 60
3.3  3.3
28.8 30
46.2 43.2
1.2  2.2
25.5 27.5
2.9 4.9
5.4 5
3.8 3.2
1 4
;
run;

proc rank data =have out =have_r;
      where diff;
      var   a_diff      ;
      ranks a_diff_r;
run;

proc print data =have_r;run;

结果:

Obs     x1      x2     diff    a_diff    a_diff_r
 1     50.7    60.0    -9.3      9.3        9.0
 2     28.8    30.0    -1.2      1.2        4.0
 3     46.2    43.2     3.0      3.0        7.5
 4      1.2     2.2    -1.0      1.0        3.0
 5     25.5    27.5    -2.0      2.0        5.5
 6      2.9     4.9    -2.0      2.0        5.5
 7      5.4     5.0     0.4      0.4        1.0
 8      3.8     3.2     0.6      0.6        2.0
 9      1.0     4.0    -3.0      3.0        7.5

二:

data have;
input x1 x2;
diff=x1-x2;
a_diff=abs(diff);
cards;
50.7 60
3.3  3.3
28.8 30
46.2 43.2
1.2  2.2
25.5 27.5
2.9 4.9
5.4 5
3.8 3.2
1 4
;
run;

proc rank data =have out =have_r;
      where diff;
      var   a_diff      ;
      ranks a_diff_r;
run;

proc print data =have_r;run;

结果:

Obs     x1      x2     diff    a_diff    a_diff_r
 1     50.7    60.0    -9.3      9.3        9.0
 2     28.8    30.0    -1.2      1.2        4.0
 3     46.2    43.2     3.0      3.0        7.5
 4      1.2     2.2    -1.0      1.0        3.0
 5     25.5    27.5    -2.0      2.0        5.0
 6      2.9     4.9    -2.0      2.0        6.0
 7      5.4     5.0     0.4      0.4        1.0
 8      3.8     3.2     0.6      0.6        2.0
 9      1.0     4.0    -3.0      3.0        7.5

注意请注意,3,9,5,6,为什么排名不同?谢谢!

1 个答案:

答案 0 :(得分:1)

运行下面的代码,你会发现它们实际上是不同的。那是因为数字存储不准确;类似于1/3不能用十进制表示法表示(0.333333333333333等)和1-(1/3) - (1/3) - (1/3)如果你使用十位数字不等于零为了存储每个结果(它等于0.000000001),任何计算机系统都会遇到某些数字的问题,而十进制(基数10)似乎很好地存储,而二进制不存在。

这里的解决方案基本上是按照你的方式进行舍入,或者fuzz结果是相同的(它忽略了小于1x10 ^ -12的差异)。

data have;
input x1 x2;
diff=x1-x2;
a_diff=abs(diff);
put a_diff= hex16.;
cards;
50.7 60
3.3  3.3
28.8 30
46.2 43.2
1.2  2.2
25.5 27.5
2.9 4.9
5.4 5
3.8 3.2
1 4
;
run;