0

私はここで何が悪いのかを理解するのに最も苦労しています:

#include <iostream>
#include <cmath>
#include <iomanip>

using namespace std;

double fact(double);
double sinTaylor(double);
double cosTaylor(double);

int main()
{
    double number, sineOfnumber, cosineOfnumber;

    cout << "Enter a number, then I will calculate the sine and cosine of this number" << endl;

    cin >> number;

    sineOfnumber = sinTaylor(number);
    cosineOfnumber = cosTaylor(number);

    cout << fixed << endl;
    cout << cosineOfnumber << endl;
    cout << sineOfnumber << endl;

    return 0;
}

double fact(double n)
{
    double product = 1;
    while(n > 1)
     product *= n--;
    return product;
}

double sinTaylor(double x)
{
    double currentIteration, sumSine;

    for(double n = 0; n < 5; n++)
    {
        currentIteration = pow(-1, n)*pow(x, 2*n+1) / fact(2*n+1);
        sumSine += currentIteration;
    }
    return sumSine;
}

double cosTaylor(double y)
{
    double currentIteration, sumCosine;

    for(double n = 0; n < 5; n++)
    {
        double currentIteration = pow(-1, n)*pow(y, 2*n) / fact(2*n);
        sumCosine += currentIteration;
    }
    return sumCosine;
}

さて、これが私のコードです。私はそれにかなり満足しています。1つを除いて、sineOfnumberとcosOfnumberは、sinTaylorとcosTaylorを呼び出した後、互いに出力する次のcout行に互いに追加します。つまり、numberがたとえば.7853と等しい場合、cosineOfnumberを出力する予定の行に1.14が出力され、sineOfnumberは結果を正常に出力します。誰かが私がこれがなぜであるかを特定するのを手伝ってもらえますか?どうもありがとう!

4

2 に答える 2

4

関数で変数sumSineとsumCosineを初期化したことはありますか?ゼロから開始することは保証されていないため、ループ内で+ =を呼び出すと、計算された値がガベージに追加される可能性があります。

これらの2つの変数をゼロに初期化してみて、それ以外はコードに問題がないように見えるので、何が起こるかを確認してください。

于 2013-02-12T03:23:17.570 に答える
0

サインのシリーズは(LaTeXの場合は申し訳ありません):

sin(x) = \sum_{n \ge 0} \frac{x^{2 n + 1}}{(2 n + 1)!}

見てみると、項t_ {2 n + 1}が与えられると、項t_ {2 n+3}を次のように計算できます。

t_{2 n + 3} = t_{2 n + 1} * \frac{x^2}{(2 n + 2)(2 n + 3)}

したがって、項が与えられると、次の項を簡単に計算できます。コサインのシリーズを見ると、似ています。結果のプログラムはより効率的で(階乗の再計算なし)、より正確になる可能性があります。浮動小数点数を合計するときは、小さいものから大きいものへと追加する方が正確ですが、ここで違いが生じるとは思えません。

于 2013-02-12T03:28:38.140 に答える