楼主: luijb
4984 31

两种求和方式为什么有如此大的差异? [推广有奖]

21
fromsummer 发表于 2013-9-13 23:16:23
负14次方已经很小了,从计算数学的角度来看sum1就是等于sum2

22
jingju11 发表于 2013-9-14 06:15:51
周末轻松,用SAS把诸位所说的基本上都验证了一遍.对或错,或者半对半错,已经不重要了.
总结一下:
(1)无法还原出原问题中的所谓的很大(绝对)差异.100个比较,99个不等,未见得差异大.
(2)SAS总体上也试图保证相对精度.也就是说,基本上,如果所加数越小,其结果差异越小
(3)"严格"意义上的"相等"SUM()=+,也就是诸位所追求,差不多总有80%的概率出现.但是是(肉眼上)无法预测的.所以等或不等就没有意义了.
我自己的看法:
1.SAS的sum从计算的角度上,和+的区别总表现在缺失值上.这是SAS官方说法.争论可以,纠缠无益.
2.非整数字变量之间的比较经常是不安全的.但是在给定精度之上,既安全,又具备实际意义.
3.关于精度所造成的麻烦,如果在比较上,如该问题,是容易解决的:注意就行了;如果是圆整误差在巨量计算中因为误差累积所造成的精度损失甚至错误,是计算机或者算法设计本身所面临的普适性难题.如果大家具备真知灼见,应该是开拓性的贡献.
京剧

23
bobguy 发表于 2013-9-14 06:33:34
This is because some of variables have missing values.
See example below,
data _null_;
   sum1=sum(1,.);
   sum2=1+.;
   sum1=sum(1,2);
   put sum1= sum2=;
   sum2=1+2;
   put sum1= sum2=;
run;

24
luijb 在职认证  发表于 2013-9-14 06:51:17
fromsummer 发表于 2013-9-13 23:16
负14次方已经很小了,从计算数学的角度来看sum1就是等于sum2
但是 根据计算结果筛选数据 就有问题,非常大的问题。
就像例子中的,我想筛选 各变量之和不等于100的,筛选出来的结果却是等于100的。
西格玛临床统计服务工作室http://www.sigma-stat.com/,luijb@163.com

25
pobel 在职认证  发表于 2013-9-14 11:09:02
luijb 发表于 2013-9-14 06:51
但是 根据计算结果筛选数据 就有问题,非常大的问题。
就像例子中的,我想筛选 各变量之和不等于100的, ...
像这种由于SAS存储所造成的精度误差一般都是很小的,如负14次方级别。
这种情况下,fuzz()函数也许会显得很可爱,如果把
     if sum(x,y)= 1.5           then ...
改成 if fuzz(sum(x,y)-1.5)=0 then ...
应该会避免这类问题的出现。

和谐拯救危机

26
fromsummer 发表于 2013-9-14 17:19:36
luijb 发表于 2013-9-14 06:51
但是 根据计算结果筛选数据 就有问题,非常大的问题。
就像例子中的,我想筛选 各变量之和不等于100的, ...
你可以换个判断条件“sum1减sum2的绝对值小于10的负7次方”,试试看?

27
sxlion 发表于 2013-9-14 18:04:05
其实这个问题涉及到两个问题:

1,SAS的问题:SAS里面很多计算可以通过多种方式来时间,但是并不是全部等价的,看看帮助里面note就知道。
2,精度问题 ,这个不是SAS的问题,是计算机的存储问题,当然可以通过设置变量来解决。

28
吕小布韦 发表于 2013-9-14 21:25:54
楼主是不是该出来看看,是否满意了

29
luijb 在职认证  发表于 2013-9-15 15:46:38
哈哈,我一直在看,也与行业内的朋友讨论过,原理正如诸位大侠所讲,小数的计算和存储的问题,解决的方法是涉及到比较的时候一定要规定精度,用fuzz函数,是可靠的。
谢谢大家真知灼见,谢谢!~
西格玛临床统计服务工作室http://www.sigma-stat.com/,luijb@163.com

30
是风啊 发表于 2013-9-16 17:24:47
有两点:第一点,个人觉得楼主的求和函数有失恰当,求和语句应该为sum1=sum(of zzbl1 zzbl2 zzbl3 zzbl4 zzbl5 zzbl6 zzbl7),即求x1,x2两个自变量的和可以用函数SUM(x1,x2) ,另外x1 ,x2的和可以等价地用SUM(OF x1 x2)或SUM(OF x1-x2)来表示,但是必须注意的是两种写法不能混在一起,比如SUM(OF x1,x2)和SUM(x1-x2)都是错误的;第二点,第9楼的解释我完全同意,可以这样验证一下9楼的说法,把语句‘d=sum2-sum1;’改为‘d=int(sum2-sun1);’  可以得到楼主想要的结果,结果即为0。谢谢!

您需要登录后才可以回帖 登录 | 我要注册

本版微信群
加好友,备注cda
拉您进交流群
GMT+8, 2026-1-24 17:20