3

級数を合計するために次のコードを書きました(-1)^i*(i/(i+1))。しかし、それを実行すると-1、nの任意の値が得られます。

誰かが私が間違っていることを指摘できますか?前もって感謝します!

#include <iostream>
using namespace std;

int main()
{
    int sum = 0;
    int i = 1.0;
    int n = 5.0;

    for(i=1;i<=n;i++)
        sum = (-1)^i*(i/(i+1));

    cout << "Sum" <<" = "<< sum << endl;
    return 0;
}
4

7 に答える 7

14

問題#1: C++^演算子は数学のべき級数演算子ではありません。これはビット単位のXORです。

pow()代わりに使用する必要があります。

問題#2: 浮動小数点型を整数型に格納しています。したがって、次の結果は整数除算(切り捨て除算)になります。

i/(i+1)

問題#3: あなたは実際には何も要約していません:

sum = ...

する必要があります:

sum += ...

コードの修正バージョンは次のとおりです。

double sum = 0;
int i = 1;
int n = 5;

for(i = 1; i <= n; i++)
    sum += pow(-1.,(double)i) * ((double)i / (i + 1));

この場合、実際に使用する必要はありませんがpow。奇数/偶数の簡単なテストで十分です。

double sum = 0;
int i = 1;
int n = 5;

for(i = 1; i <= n; i++){
    double val = (double)i / (i + 1);
    if (i % 2 != 0){
        val *= -1.;
    }
    sum += val;
}
于 2012-02-03T20:18:46.970 に答える
4

合計を入れる必要があります+=pow(-1、i)*(i /(i + 1));

そうしないと、毎回前の結果が失われます。

pow操作にはpow関数を使用します。

編集:他の投稿で述べたように、切り捨てられた除算を避けるために、intの代わりにdoubleまたはfloatを使用してください。

于 2012-02-03T20:19:25.390 に答える
3

これはどう

((i % 2) == 0 ? 1 : -1)

それ以外の

std::pow(-1, i)

完全な答え:

double sum = 0;
int i = 1.0;
int n = 5.0;
for (i = 1; i <= n; ++i) {
    signed char sign = ((i % 2) == 0 ? 1 : -1);
    sum += sign * (i / (i+1));
}
于 2012-02-03T20:24:01.880 に答える
2

いくつかの問題:

  1. ^はビット単位の排他的論理和であるか、C++では「パワーアップ」されていません。pow()メソッドを使用します。

  2. 最後の行からぶら下がっているオープニングブラケットを削除します

  3. intに割り当てるときは、floatではなくintを使用します。

于 2012-02-03T20:20:00.683 に答える
2

コードにいくつか問題があるようです。

using namespace std;

これは目前の問題に直接関係しているわけではありませんが、using namespace std;微妙なバグが発生するとは言わないでください。

int i = 1.0;
int n = 5.0;

浮動小数点定数を使用して積分変数を初期化しています。試す

int i = 1;
int n = 5;


sum = (-1)^i*(i/(i+1));

この式には2つの問題があります。まず、数量(i/(i+1))は常にゼロです。int結果を2ラウンドに分割することを忘れないでください。第二に、^あなたが思っていることをしません。これは排他的論理和演算子であり、べき乗演算子ではありません。第三に、^バインドは、よりも緊密ではない*ため、式は次のようになります。

-1 xor (i * (i/(i+1)))

-1 xor (i * 0)
-1 xor 0
-1
于 2012-02-03T20:24:30.800 に答える
1

^あなたが思っていることをしません。また、コードには他にもいくつかの間違いがあります。

それがどうあるべきか:

#include <iostream>
#include <cmath>

int main( )
{
    long sum = 0;
    int i = 1;
    int n = 5;

    for( i = 1; i <= n; i++ )
        sum += std::pow( -1.f, i ) * ( i / ( i + 1 ) );

    std::cout << "Sum = " << sum << std::endl;

    return 0;
}

値の累乗を取得するには、を使用しますstd::powここを参照)。intまた、10進値に割り当てることはできません。そのためには、floatまたはを使用する必要がありますdouble

前述の^値はビット単位のXORであり、指数のマークではありません。

また、予期しない結果が生じる可能性があるため、整数演算にも注意してください。ほとんどの場合、変数をまたはのいずれかに変更する必要がありfloatますdouble

于 2012-02-03T20:21:35.487 に答える
1

コードにはいくつかの問題があります。

int sum = 0;

中間結果は整数ではありません。これはdoubleである必要があります

int i = 1.0;

これを除算で使用するため、doubleにする必要があります。整数で計算すると、1/2は0になります。

int n = 5.0;

これは整数であり、浮動小数点値ではありません。.0は必要ありません。

    for(i=1;i<=n;i++)

すでにiを1に初期化していますが、なぜもう一度初期化するのですか?

sum = (-1)^i*(i/(i+1));

以前の値を失うたびに、sum +='新しい値'を使用する必要があります

また、計算するのにpowは必要ありません。(-1)^iこれは、の奇数/偶数ステータスに応じて+1と-1を切り替えるだけですiifこれは、ステートメントまたは2を使用して、簡単に行うことができますfor。1つは奇数用、1つは偶数i用です...実際には多くの選択肢があります。

于 2012-02-03T20:27:33.217 に答える