カンパ〜イ!←最初の1杯目、なに頼む?

指数関数のマクローリン展開のプログラムです。
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()
}

A 回答 (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;
}
数値計算は奥深いので、もっといいやり方があるかもしれません。
    • good
    • 2
この回答へのお礼

検証してみました。
これほど簡単にできるものなのですね。
考え方として、分子分母別で計算した方が考えやすいかと思ってやっていました。

これを参考にまた作りなおしてみようと思います。

ありがとうございました。

お礼日時:2009/05/09 17:10

ご提示のソースは



>return()

ここでコンパイルエラーが出るため、論評できかねます。
お手元にある、x=1以外の場合でうまく動かないというソースを、
そっくりそのまま貼り付けていただけますか?
    • good
    • 0
この回答へのお礼

すいませんでした
その部分は書き間違いです・・・
こちらでコンパイルは正常にできています

コピペができないのでアレなんですけども・・・
x=5の場合
6.00000000
18.5000000
122.666666
16398.70833・・・
1271582153.・・・・・・
これ以降はものすごく大きな数字になります。
そして Inf Inf Inf・・・ と表示されています。
おそらくxのn乗のあたりがおかしいからこうなるのかと思っているのですが、朝からずっといろいろやってみていてこのありさまです。

お礼日時:2009/05/09 16:59

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!


おすすめ情報