C言語計算e及びeの次数の近似値

1651 ワード

まずeの近似値を計算することを考慮して、式を使用します:e=1+1/1!+1/2!+1/3!+……(「/」は除く)
コードは次のとおりです.
/*  e    */
#include

main(){
   int i,j,a,b=1;
   float d=1;
   printf("       n :");
   scanf("%d",&a);
   for(i=1;i<=a;i++){
    for(j=1;j<=i;j++){
       b*=j;
    }
    d+=1.00/b;
    b=1;
   }
   printf("e  :%.2f
",d); return 0; }

e^mの近似値を計算することを考慮し、式を使用します:e^m=1+m/1!+m^2/2!+m^3/3!+…… .
コードは次のとおりです.
#include

main(){
 int i,j,n,m,c=1;
 float d=1;
 /*n        n        */
 printf("   n :
"); scanf("%d",&n); /*m */ printf(" m :
"); scanf("%d",&m); for(i=1;i<=n;i++){ for(j=1;j<=i;j++){ c*=j; } d+=pow(m,i)/c; c=1; } printf("e^m %.2f",d); }

以上の2つの簡単なプログラムについて、いくつかの点に注意してください.
1、ここでは数学の中の展開式をプログラム設計に用い、eの近似値を求めるように、一見手がつけられないかもしれないが、数学式で展開すると、はっきりしている.
2、ここで2つのプログラムの整数次乗算値の計算は正常に関数にカプセル化され、コードの多重性を強化しなければならない.
3、2つのコードの中のn値は2つの展開式の中のn値に対応し、近似値の精度を制御することができ、n値が大きいほど、近似値を表示する際に要求される小数位が多くなり、正確になる.
4、ここにはもう一つのc言語のタイプ変換の問題があります.最初のプログラムのように、「d+=1.00/b」という言葉は味わう価値があります.左側のdはfloatタイプに設定されているに違いありませんが、右側の1.00を1に変更すると、もちろんだめです.2つの整数を差し引くと計算結果の小数部が切り取られ、最終結果は2.00になります.一方、1を1.00に変更すると、右側は浮動小数点数を1つの整数で割ったものになりますが、cコンパイラは操作数の計算方法しか知りません.タイプが同じ式によれば、この除去プロセスには、bの値をコピーし、コピー値をfloatタイプに引き上げた後に除去するタイプのアップグレードが存在し、結果は正しい浮動小数点数である.前述のタイプのアップグレードは暗黙的変換とも呼ばれ、ここでは「d+=(float)1/b」を用いた結果も完全に正しい.
5、4の理論を用いて、2番目のコードの「d+=pow(m,i)/c;明示的または暗黙的なタイプ変換は行われていないようですが、結果は正しいようです.実際,pow()関数の戻り値はdoubleタイプであるため,ここでも暗黙的なタイプ変換が行われている.