天天看點

Matlab浮點數累加誤差## Matlab浮點數累加誤差引起的判斷錯誤

## Matlab浮點數累加誤差引起的判斷錯誤

第一次發文,記錄一下,用詞不當,還望指正。

在使用Matlab的過程中,進行了如下的一次循環,(Q_site=[0,2],sub_Q初始化為1),如果使用(Q_site[1,sub_Q]+0.1==i)直接判斷二者是否相等,在i循環至0.5時,由于浮點數累加導緻的誤差,此時的if值為假,無法進入if語句,進而無法得到後續的正确結果。在浏覽了相關部落格之後,采用abs(i-(Q_site(1,sub_Q)+0.1))<eps,通過eps判斷當兩者的誤差在這個精度之内即為相等,但當i繼續累加至1左右,累計的誤差便超過了eps,由于我這裡對精度要求在0.1,是以我選擇将eps100來作為控制精度。同時在第二個if語句中,我的本意是當Q_site(1,sub_Q)的值比Q_site(1,sub_Q+1)的值小0.1時,便停止遞增,但由于累加引起的損失誤差,會導緻這個內插補點比0.1略大,進而會在正确的累加基礎上再累加一次,通過對第二個if語句進行計數可以驗證,是以在判斷條件中添加了一個控制精度,即100eps來確定正确的累加次數。可以在指令行視窗中輸入“eps”擷取eps的值。

for i=0:0.1:sum_span
    if (abs(i-(Q_site(1,sub_Q)+0.1))<100*eps)&&(i>0)
        value_of_shear(1,index)=value_of_shear(1,index-1)-0.1*Q_value(1,(sub_Q+1)/2);
        if (Q_site(1,sub_Q)+0.1)+100*eps<Q_site(1,sub_Q+1)
        Q_site(1,sub_Q)=Q_site(1,sub_Q)+0.1;
        digit=digit+1;
        else
            if sub_Q<(num_Q-1)
               sub_Q=sub_Q+2;
            end
        end
        signal=1;
        sign=1;
   end 
end
           

繼續閱讀