2017-10-11 5 views
-3

このコードは逆階乗を添加することにより数学定数Eを計算することを意味する:私の計算で数値の代わりに「inf」が返されるのはなぜですか?

#include <stdio.h> 
void main() 
{ 
    int i, n,a; 
    float result=1; 
    float sum; 
    a=1; 
    sum=0; 
    printf("Enter a number:\n"); 
    scanf("%d",&n); 

    for (i=0;i<=n-1;i++) 
    { 
     result=result*i; 
     sum = a + (i/result); 

    } 

    printf("%.2f is the answer\n",sum); 

}

代わりEの値を与えるのではなく、inf is the answerを生成します。

なぜ2.78ではなくinfが得られますか?

+2

可能な複製(https://stackoverflow.com/questions/25577846/program-returning-inf) – Gianlucca

+0

読むます。http:/以下は、より良い変数名を使用して、そのソリューションであります/floating-point-gui.de/ –

+6

ループを初めて実行するときには、 'result'を0倍します(' i'は0に初期化されるため0を返します)。したがって 'result'は常に0になります。 result'(次の行は 'sum = a +(i/result);')は無限大と等しくなります。 – AntonH

答えて

3

エラーは、0で除算していることに起因します。

あなたは階乗の合計を見つけようとしていると言うが、あなたの代わりに

sum = 0! + 1! + 2! + ... + n! 

sum = 1 + 0/0 sum = 1 + 1/0 sum = 1 + 2/0 ... sum = 1 + n/0

をしたエラーの数は驚異的です!あなたは合計を実行せず、各項に因子を導入する必要はありません。階乗の代わりに階乗のインターバースを使用しました。1を追加して、階乗を計算しません0!1の代わりに0としたためです

if (i) 
    result=result*i; 

sum = sum + result; 

それはループが第二始まる次いで、最初用語と変数をシード単純溶液で

result=result*i; 
sum = a + (i/result); 

を交換します。以下は、より良い変数名を使用して、その解決策です:

int N; 
int n; 
int n_fact = 1; 
int sum = 1; 

printf("Enter the number of terms: \n"); 
scanf("%d", &N); 

for (n=1; n<N; ++n) { 
    n_fact *= n; 
    sum += n_fact; 
} 

[私はもともとあなたが電子 を計算しようとしていたと思いました。実際にそうであるかもしれない場合、私はここに私の元の答えを残すつもりです。]

あなたが言及しているエラーは、0で分けているという事実に起因しています。

あなたはかなりの数の誤りを犯したあなたは電子を近似しようとしているように見えるが、あなたは

e = 1 + 0/0 e = 1 + 1/0 e = 1 + 2/0 ... e = 1 + n/0

代わりの

e = 1/(0!) + 1/(1!) + 1/(2!) + ... + 1/(n!) 

をしました!あなたは合計を実行しないでください。あなたはの代わりにをの代わりにしたので、何もないはずの各項に因子を導入しました。

if (i) 
    result=result*i; 

sum = sum + (1/result); 

それはループが第二始まる次いで、最初用語と変数をシード単純溶液で

result=result*i; 
sum = a + (i/result); 

を交換します。

int N; 
int n; 
int n_fact = 1; 
float e = 1; 

printf("Enter the number of terms: \n"); 
scanf("%d", &N); 

for (n=1; n<N; ++n) { 
    n_fact *= n; 
    e += 1/n_fact; 
} 
[プログラムのinfファイルを返す?]の
関連する問題