作者micklin (Mick@Tucson)
看板CSSE
标题Re: [问题] 怪异的加总问题
时间Fri Mar 9 05:30:38 2007
※ 引述《jackeyH (面包小男孩)》之铭言:
: ※ 引述《micklin (Mick@Tucson)》之铭言:
: : 我写了一只程式对100*100的矩阵做QR分解, 然後输出eigenvalue及eigenvector.
: : 然後我把两个eigenvector相乘, 得到一个数值.
: : 这两个100个元素的向量, 里面的值是实数且有正有负,
: : 问题来了, 我用程式加总之後的值跟Excel算出来的不一样....
: : 为了找出问题, 我印出 v1[i] v2[i] v1[i]*v2[i] 的值,
: : 然後用程式算出 v1[i]*v2[i] 的值,
: : 再把 v1[i]*v2[i] 的值贴到 Excel 用 Sum() 加总.
: : 程式算出来的值是 7.1991e-017
: : Excel 算出来的值是 0.00000008896 = 8.896e-8
: : 差太多了, 我实在无法用"误差"来说服自己....
: : 有人遇过类似的问题吗?
: : 程式算出来的v1[i]*v2[i]和Excel算出来的倒是没太大差异.
: : 如果只计算 0 到 98 项, 或 1 到 99 项, 程式和 Excel 也没太大差异.
: : 若一百项全加起来, 值就差很多, 又因为我要求此值的倒数,
: : 整个情况变的很混乱....
: : 又, 我用VC2003, Release跟Debug所求出来的值是一样的.
: 如果你确定你在计算的Algorithm Implement没错的话
: 会不会是你用的资料型态超过可以最大可表示的位数导致你计算时候
: 资料爆炸导致误差?
: 我记得在如果是在.Net Framework 1.0上的话
: 以保留字保留字 flaot 宣告一个数值会用32bit表示一个浮点数
: 而double会用64bit表示一个浮点数..
我是用long double来求加总, 而这100个元素值也都是double.
以下的vi与vj是两个我自己定义的vector物件,
而v是此物件的member, 是一个double阵列.
long double test1=0,test2=0,test3=0;
for(int k=0;k<numGene;k++){
cout<<vi.v[k]<<"\t"<<vj.v[k]<<"\t"<<vi.v[k]*vj.v[k]<<endl;
test1=test1+(vi.v[k])*(vj.v[k]);
if(k>0) //求 1~numGene 加总
test2=test2+(vi.v[k])*(vj.v[k]);
if(k<numGene-1) //求 0~numGene-1 加总
test3=test3+(vi.v[k])*(vj.v[k]);
}
cout.precision(10);
cout<<vi*vj<<"\t"<<test1<<"\t"<<test2<<"\t"<<test3<<endl;
最後一行的vi*vj是自己定义的乘法, 算出来的值跟test1一样.
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 68.231.146.70