私が見ることができる3つのエラー:
- タイプミス (
premix
vs prefix
)
- 整数型の使用
- (@Light に感謝): 初期化
sum
代わりに次のことを試してください。
#include <stdio.h>
int main () {
int n, n_initial;
double sum=0.0, prefix = 1.0;
printf("enter the value for n:\n");
scanf("%d", &n);
if(n<1) {
printf("n must be > 0!\n");
return 1;
}
n_initial = n;
if (n%2==0) prefix = -1.0; else prefix= 1.0;
do {
sum+= prefix/(double)n;
prefix *= -1.0;
n--;
} while (n > 0);
printf("The sum of the series over %d terms is: %lf\n", n_initial, sum);
return 0;
}
注 -n
整数として保持し、除算の前に明示的にキャストします。float / double にする方が良いかもしれません - それに応じて のフォーマット仕様を変更することを忘れないでくださいscanf
。モジュロ演算は 1 回だけ行います (その後、符号はprefix
変化し続けます)。また、数値を入力するプロンプトを追加して (「なぜ何もしないの?!」)、結果に注釈を付けて (「数値だけ」を出力するのではなく)、終了することも常に良い考えです。改行で出力します (プロンプトがプログラムの出力を不明瞭にしないようにします)。
最後に、ユーザーが負の数を入力していないことを確認したい場合があります。これにより、コードが悪い結果を出す可能性があります。
後付けとして、 の大きな値をテストしてn
、 を返すことができますlog(2.0)
。しかし、それは不正行為です...そして、このシリーズは非常にゆっくりと収束します(非常にひどく振動します-n=1000の場合、3桁目はまだ変化しています)。その結果、丸め誤差は実際に悪化するリスクがあります。double
これが、タイプを使用する必要がある理由です。しかし、他の計算方法を検討することは有益であることをお勧めlog(2.0)
します。実際にそれらすべてを実装し、n 項の後でそれらの精度を比較することができます (エラー: を出力することによりsum - log(2.0)
)。