0

プログラムが機能しないのはなぜですか? 式 1-(1/2)+(1/3)...+(1/999)-(1/1000)= から数値を加算することになっています

#include <stdio.h>
#include <math.h>
int main () {
 int i, j;
 float  suma;
 suma = 0.f;
 for (i=0; i<1000; i++) {
    if (i%2==0) {
        suma=suma - 1/i;
    } else {
        suma=suma + 1/i;
    }
 }
 printf("%f", suma);

}
4

5 に答える 5

5

で印刷1 / iiてみてくださいintiisの場合を除いて、これは常に 0 を返します1。これは、 がユークリッド除算1 / iとして評価され、剰余が破棄されるために発生します。

これがこのように評価される理由は、1iが両方とも整数だからです。分子または分母のいずれかを浮動小数点型にする必要があります。

1 つの方法は float にキャストiすることで、コードは次のようになりますsuma = suma - 1 / (float)i。もう 1 つの方法は、1be を浮動小数点型にすることです:suma = suma - 1.0 / iまたはsuma = suma - (float)1 / i.

于 2013-08-13T09:25:55.470 に答える
1

最初にいくつかの数学を適用すると、はるかに高い精度が得られます。あなたのシリーズ:

1 - 1/2 + 1/3 - 1/4 + ... + 1/999 - 1/1000

次のように書き換えることができます。

(1 - 1/2) + (1/3 - 1/4) + ... + (1/999 - 1/1000)

またはとして:

1/(1*2) + 1/(3*4) + ... + 1/(999*1000) 

これで、計算を実行するプログラムを作成できます。ただし、double型を使用して精度を向上させ、integer を double にキャストして、シリーズが double の数値として追加されるようにする必要があります。

#include <stdio.h>
#include <math.h>
int main() {
    int i;
    double sum = 0;
    for (i=1; i<1000; i+=2) {
        sum += 1/(i*(i+1.)); // 1. to force cast to double
    }
    printf("%g", sum);
}
于 2013-08-13T10:40:30.140 に答える