- ベストアンサー
指数関数のプログラムを組んでいるのですが・・・(初心者)
指数関数のマクローリン展開のプログラムです。 x=1の場合はしっかりと値が収束するのですが、それ以外ではうまくいきません。 以下のように組んだのですが、どこがまちがっているのでしょうか? 1.n!を求める。 2.x^nを求める。 3.これらを割る。 4.exに足していくという手順でやっているつもりです。 よろしくおねがいします。 ______________________ #include<stdio.h> main() { double a,i,j,k,l,m,n,x,ex; printf("x="); scanf("%lf",&x); n=1; ex=1; m=x; for(i=1;i<100;i++){ m=x; n=n*i; for(k=1;k<i;k++){ m=m*m; } a=m/n; if(a<0.000001){ return 0; }else{ m=x; ex=ex+a; } printf("%lf ",ex); } return() }
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
分子・分母を個別に計算しているので、それぞれオーバーフロー(doubleで表現できる値の範囲を越える)してますね。途中の m とか n の値を表示させてみるとわかると思います。 それ以外にもおかしな点はありますが。 もとのプログラムをあまり変えない範囲で書き直すと、 #include <stdio.h> main() { double x,a,ex,i; printf("x="); scanf("%lf",&x); a=1; ex=1; for(i=1;i<100;i++){ a=a*x/i; if(a<0.000001) break; ex=ex+a; printf("%lf\n",ex); } return 0; } 数値計算は奥深いので、もっといいやり方があるかもしれません。
その他の回答 (1)
- asuncion
- ベストアンサー率33% (2127/6289)
ご提示のソースは >return() ここでコンパイルエラーが出るため、論評できかねます。 お手元にある、x=1以外の場合でうまく動かないというソースを、 そっくりそのまま貼り付けていただけますか?
お礼
すいませんでした その部分は書き間違いです・・・ こちらでコンパイルは正常にできています コピペができないのでアレなんですけども・・・ x=5の場合 6.00000000 18.5000000 122.666666 16398.70833・・・ 1271582153.・・・・・・ これ以降はものすごく大きな数字になります。 そして Inf Inf Inf・・・ と表示されています。 おそらくxのn乗のあたりがおかしいからこうなるのかと思っているのですが、朝からずっといろいろやってみていてこのありさまです。
お礼
検証してみました。 これほど簡単にできるものなのですね。 考え方として、分子分母別で計算した方が考えやすいかと思ってやっていました。 これを参考にまた作りなおしてみようと思います。 ありがとうございました。