2013-02-12 83 views
0

我有困難的時候搞清楚什麼是錯在這裏:問題與COUT(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行中相互添加,以便相互打印。 換句話說,如果number等於可以說,.7853,1.14將打印在打印餘弦號的行中,並且sineOfnumber將正常打印結果。 任何人都可以幫助我確定這是爲什麼?非常感謝!

+4

帶'double'參數的factorial函數和帶'double'計數器的for循環都是壞跡象。 – chris 2013-02-12 03:15:32

+0

是的,我知道。老實說,這真的讓我感到很難受,我認真地不能讓程序做它應該做的事,除非一切都是雙重的。這是不正確打印餘弦數字的原因嗎? – user2063355 2013-02-12 03:18:21

+0

它可能是。這是'pow'功能給你一個難的時間嗎?只要確保一個參數是雙重的。例如,'pow(-1。,n)' – chris 2013-02-12 03:20:12

回答

4

你是否曾經初始化函數中的變量sumSine和sumCosine?它們不保證從零開始,所以當你在循環中調用+ =時,你可能會將計算值添加到垃圾。

試着將這兩個變量初始化爲零,看看會發生什麼,除此之外,代碼看起來沒問題。

+0

它工作!非常感謝你,認真。作爲最終的請求,爲什麼這解決了我的問題? – user2063355 2013-02-12 03:29:17

+0

如果你沒有用C或C++初始化一個變量,那麼編譯器不會強迫你爲你做。在你的函數被調用的時候,你的雙打只是裝滿了堆棧中的任何垃圾。這是我無需超技術就可以給出的最佳描述。 (如果解決了問題,您是否可以將答案標記爲正確?) – bstamour 2013-02-12 03:31:31

+0

@ user2063355,因爲如果未初始化,它可以以2或768或1565626的值開始。在這種情況下,它可能從另一個函數調用中獲得了剩餘的值,這就是爲什麼它看起來像添加了兩個。 – chris 2013-02-12 03:31:53

0

該系列的正弦是(遺憾的膠乳):

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)} 

因此,給定一個術語,您可以輕鬆計算下一個術語。如果你看看餘弦的系列,它是相似的。由此產生的程序更有效率(無重算因子),可能更精確。將浮點數加起來時,將它們從最小值加到最大值會更精確,但我懷疑這會對其產生影響。