- ベストアンサー
MATLABの計算精度
いま, A=[0.803, -0.803, 1.2124, 0.803, -0.803, -0.803, 1.2124, 0.803]; とします. このとき,次の2通りの演算をします. (i) a=0; for I=1:8 if( A(I)>=0 ) a=a+A(I)*0.25; else a=a+A(I)*0.75; end end (ii) Bi=[0.25, 0.75, 0.25, 0.25, 0.75, 0.75, 0.25, 0.25]; b=sum(Bi.*A); (i)と(ii)によって得られる和の値をMATLABのコマンド上で表示すると, 同じ値として表示されるのですが,a-b と計算すると,0 ではなく, 8.04e-15のようになります.(現環境ではMATLABが使えないので,確認できませんが,もっと大きいデータでやったとき場合には,上記のように誤差が生じました). 困っているのは,現在組んでいるプログラムでは計算した値の正負によって 異なった計算をする必要があり,計算精度が非常に重要になってきます. そのため計算結果が例えば +1.4e-15となるか -6.4e-16 となるかによってその後の計算結果が大きく変わってしまいます. MATLABでは,上記(i)(ii)のような誤差が生じるためか,+1.4e-15となってほしいところが,なぜか -6.4e-16となってしまいうまくプログラムが動きません. MATLABでは,for文によって和をとるのではなく,一回でまとめて計算しなければ誤差が生じるのでしょうか? また,MATLABで計算精度を変更できないのでしょうか? (formatコマンドによって,「format short g」「format double g」としましたが有効な小数点が増減するだけで結果は同じでした.) よりよい精度で計算するにはどうしたらよいのでしょうか? 回答よろしくお願いします.
- みんなの回答 (1)
- 専門家の回答
みんなが選んだベストアンサー
>よりよい精度で計算するにはどうしたらよいのでしょうか? の直接的な回答としてはSymbolic Math Toolboxを使って関数symやかdigitsとvpaを使うとかいう方法がありますが、それ以前に計算した値の正負によって異なった計算をする必要があるような計算アルゴリズムを見直すことが先決でしょう。通常は浮動少数の計算には誤差があるのですから、それを判定条件にすることは一般には考えられず、整数を使った判定が出来ないのかどうかを検討してください。 0.803とか1.2124とかが、もし測定値であったらもともとその数値には誤差があることを見込んでアルゴリズムを構築すべきでしょうし、数値計算的にはa=0.803という代入だけでも誤差が混入することに気がついていなければなりません。
お礼
なるべく誤差が生じないようdigits関数を使って検証したいと思います。 回答ありがとうごさいました。