pobel 发表于 2013-9-13 10:48 
以下纯属个人推测:
我认为这应该和SUM()函数的工作机制有关系,也就是SUM()函数将各个参数加和的方式和 ...
同意。
这不仅和浮点数用二进制表达的精度问题有关系,还跟sum()和加号的工作机制有关系。
求和结果取决于中间存储,每次存储都有可能损失精度。
sum(35.8,17.8,17.8) 和 35.8+17.8+17.8的结果是一样的,先计算35.8+17.8并存储,然后用存储值+17.8。sum(17.8,17.8,35.8) 和 17.8+17.8+35.8一样,先计算17.8+17.8并存储,然后用存储值+35.8。
如果将程序改为
data test1;
x1 = 35.8; x2 = 17.8; x3 = 17.8;
sum1=sum(x1,x2,x3);
sum2=sum(x2,x3,x1);
put sum1= hex16.;
put sum2= hex16.;
d=sum2-sum1;
put d=;
run;
data test2;
x1 = 35.8; x2 = 17.8; x3 = 17.8;
sum1 = x1 + x2 + x3;
sum2 = x2 + x3 + x1;
put sum1= hex16.;
put sum2= hex16.;
d=sum2-sum1;
put d=;
run;
会发现sum()的结果不一样但用加号的时候结果却是一样的。推测是在使用变量的时候,sum()仍然采用中间存储机制,但是加号却不产生中间结果