※ 引述《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