2013-02-12 5 views
0

Я имею трудное время выяснить, что здесь не так:Проблемы с соиЬ (C++)

#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; 
} 

Итак, вот мой код. Я довольно доволен этим. За исключением одного: sineOfnumber и cosOfnumber после вызова sinTaylor и cosTaylor добавят друг друга в следующую строку cout, которая будет печатать друг друга. Другими словами, если число равно разрешению, то в строке, предназначенной для печати cosineOfnumber, будет напечатано 1.14, а в строке sineOfnumber будет напечатан результат. Может ли кто-нибудь помочь мне определить, почему это так? Спасибо огромное!

+4

Факторная функция с параметром 'double' и цикл for с двойным счетчиком являются плохими знаками. – chris

+0

Да, я знаю. Честно говоря, это действительно беспокоит меня до смерти, я серьезно не могу заставить программу делать то, что она должна, если все не будет двойным. Является ли это причиной неправильной печати cosineOnnumber? – user2063355

+0

Это может быть. Это функции 'pow' дают вам трудное время? Просто убедитесь, что один аргумент является двойным. Например, 'pow (-1., N)' – chris

ответ

4

Вы когда-нибудь инициализировали переменные sumSine и sumCosine в своих функциях? Они не гарантированно начинаются с нуля, поэтому, когда вы вызываете + = внутри цикла, вы можете добавлять вычисленные значения в мусор.

Попробуйте инициализировать эти две переменные до нуля и посмотреть, что происходит, как и ничего, что код выглядит нормально.

+0

Это сработало! Большое вам спасибо, серьезно. Как последний запрос, почему это устранило мою проблему? – user2063355

+0

Если вы не инициализировали переменную в C или C++, то компилятор не должен делать это за вас. Ваши двойники были просто заполнены тем, что мусор был в стеке во время вызова вашей функции. Это лучшее описание, которое я могу дать, не выходя из супер-технических. (Можете ли вы пометить ответ как правильный, если он решил вашу проблему?) – bstamour

+0

@ user2063355, поскольку он может начинаться со значения 2 или 768 или 1565626, если он не инициализирован. В этом случае он, вероятно, получил значение, оставленное в стеке от другого вызова функции, поэтому было похоже, что они были добавлены. – chris

0

Серия для синуса (извините за LaTeX):

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

Если вы посмотрите, данный термин t_ {2 п + 1} можно вычислить срок T_ {2 п + 3} как

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

Так что, учитывая термин, вы можете легко вычислить следующий. Если вы посмотрите на серию для косинуса, это похоже. Полученная программа более эффективна (без пересчета факториалов) и может быть более точным. При добавлении чисел с плавающей запятой точнее добавлять их от самых маленьких до самых больших, но я сомневаюсь, что это будет иметь значение здесь.