- ベストアンサー
マイナスを使ってはいけない理由を教えてください。
マクローリン級数展開をコンピュータで計算する際に、マイナスの値を使うとできない計算があります。具体的な式は、e=1+x+xの2乗/2の階乗+xの3乗/3の階乗+xの4乗/4の階乗....xのn乗/nの階乗。 この計算をプログラムでやると正しいeの値がでません。私の作ったプログラムを以下に載せます。 #include <stdio.h> #include <stdlib.h> #include <math.h> #define NUMBER 1.e-15 main() { double c,x,y,total,myexp(); x=-10; y = myexp(x); total=exp(x); printf(\"input=%f\\n\",x); printf(\"myexp=%.10e\\n\",y); printf(\" exp =%.10e\\n\",total); printf(\" \\n\"); } double myexp(double x) { int count=1; double total,i,ex,hiritu; total = 1.0; ex= 1.0; hiritu=1.0; // if(x < 0 ){ // x=x*-1; // i=1; // } while(fabs(hiritu) >= NUMBER){ hiritu = total/ex; printf(\"count= %d \",count); total *= x/count++; printf(\" total=%.10e \",total); ex += total; printf(\" ex =%.10e \",ex); printf(\"\\n\"); } // if(i == 1){ // ex = 1/ex; // } return(ex); } //の行をコメントではなくすると、マイナスの値を入れたときでも、正確な値を出すプログラムになります。デバックの行なども入っていますが、コンピュータで、このプログラムを用いて、マクローリン級数展開をすると、マイナスの値で正確な値がでない理由を知りたいです。ヒントでもいいのでお願いします。
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
浮動小数点演算では、近い数字の引き算は精度がかなり低くなってしまいます。 以下、10進数で簡単に説明しますが、有効数字4桁の数字「1.234」と「1.222」を足す場合、結果は「2.456」で有効数字は4桁のままです。 ところが、この二つを引くと、1.234-1.222=「0.012」で、有効数字が2桁に落ちてしまっています。 そのため、引き算が入る場合は、有効数字は「○桁」ではなく「○の位」で考える必要があります。この例だと、有効数字は0.001=1e-3の位まで 今のプログラムの例だと、 count=6~count=14あたりでは、変数totalが1e+3オーダーで足し算引き算しています。 double の有効数字は10進16桁ですので、この段階での有効数字は1e+3 から16桁、1e-13 の位までです。 exは最終的に1e-5のオーダーになっていますが、 上記演算の有効数字は1e-13の位までですので最終結果の有効数字も1e-13の位まで。 すなわち、有効数字8桁になります。 というわけで、 > myexp=4.5399929699e-05 > exp =4.5399929762e-05 これも8桁までしか合わないことになってるわけです。
その他の回答 (1)
- Werner
- ベストアンサー率53% (395/735)
浮動小数点数を使った演算では桁落ちや情報落ちなどの誤差が発生します。 マイナスの値の時は誤差が大きくなるような条件を満たしていたのでしょう。 http://www.cc.kyoto-su.ac.jp/~yamada/pB/float.html#error
お礼
ありがとうございました。 参考URLを見て、桁落ちと情報落ちの仕組みを理解することができました。 3日間わからなくて、考えていたのですが、ようやく疑問を解くことができてとてもうれしいでした。なかなかわからなくて、わかんねーと叫びながら、数字を見て調べていました。 たすかりました。 ありがとうございます。
お礼
本当にありがとうございました。 今回、自分で桁落ちするプログラムをつくり、コンピュータの仕組みがわかりました。 教えてくださった方のように、私もプログラミングをしっかり勉強し、 社会の役に立てるよう学生生活を一生懸命頑張ります。 ありがとうございました。