- ベストアンサー
桁落ちの誤差について
- プログラムにおいて誤差が生じる理由について解説します。
- 桁落ちの誤差は、計算の精度に問題がある場合に生じます。
- 具体的には、小さな値と大きな値を引き算することで生じることが多いです。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
>このプログラムのどこが原因で誤差が生じたんでしょうか? double型を使用している箇所すべてです。 強いていえば、sum+=termの場所です。 すべての変数及び関数の戻り値をlong型にすれば、誤差は発生しません。
その他の回答 (2)
- ymmasayan
- ベストアンサー率30% (2593/8599)
提示されたプログラムには多種の誤差が存在しています。 > const double PI=3.141592653589793; ここでは小数点以下15桁で打ち切っているので「丸め誤差」が発生しています。・・(1) 計算機の内部で2進数に直した際にさらに「丸め誤差」が発生します。・・・・・・・(2) > while( n<=m ){ 計算を有限回で打ち切ったので、「打切り誤差」が出ます。・・・・・・・・・・・・(3) > sum+=term; ここでは非常に大きな数に非常に小さい数を足す場合、 「情報落ち」が発生します。・・・・・・・・・・・・・・・・・・・・・・・・・・(4) > term= 1.0/ (n*n);/*次項の計算*/ ここでも「丸め誤差」が発生します。・・・・・・・・・・・・・・・・・・・・・・(5) > printf("%2d m=%10ld sum= %22.16e err= %22.16e n",i,m,s,s-PI*PI/6); 引き算の部分は非常に近い数同士になりますので「桁落ち」が発生します。・・・・・(6) それぞれの誤差の意味はご自分で確認して下さい。 >>このプログラムのどこが原因で誤差が生じたんでしょうか? >double型を使用している箇所すべてです。 >強いていえば、sum+=termの場所です。 >すべての変数及び関数の戻り値をlong型にすれば、誤差は発生しません。 蛇足ですが、単にlong型というとlong int型のことですので、 long double型にしてください。 ただしコンパイラーによってはlong double型にしても全く変わらないものもあります。 long double型が有効な場合、誤差自体は無視できるほど小さくなりますが、 原理的には必ず少しは残ります。 特に、(1)(3)の誤差はlong double型にしても変わりません。 あえて言えば、例題自体が打切り誤差の変化を見る問題なので(3)は無視していいです。 またPIの定数定義の小数点以下の桁数を増やせば(1)も無視していい程度になります。
- tatsu99
- ベストアンサー率52% (391/751)
データでdouble型のデータを使用しているためです。 double型を使用した場合は、必ず誤差が発生します。 これを回避する方法は残念ながらありません。
補足
このプログラムのどこが原因で誤差が生じたんでしょうか?
補足
わかりました、ありがとうございました 悩んでたのが解けました