我正在努力找出问题所在:
#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;
}
好的,所以这是我的代码。我很满意。除了一件事: 在调用sinTaylor和cosTaylor之后,sineOfnumber和cosOfnumber将在下面的cout行中相互添加,它们将相互打印。 换句话说,如果数字等于,即.7853,1.14将打印在打算用于打印cosineOfnumber的行中,并且sineOfnumber将正常打印结果。 任何人都可以帮我确定这是为什么?非常感谢你!
答案 0 :(得分:4)
您是否曾在函数中初始化变量sumSine和sumCosine?它们不能保证从零开始,所以当你在循环中调用+ =时,可能会将计算值添加到垃圾中。
尝试将这两个变量初始化为零并查看会发生什么,除此之外代码似乎没问题。
答案 1 :(得分: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)}
因此,给定一个术语,您可以轻松地计算下一个术语。如果你看一下余弦的系列,它就是相似的。由此产生的程序更有效(没有重新计算因子),可能更精确。当将浮点数加起来时,将它们从最小值添加到最大值更精确,但我怀疑这会在这里产生影响。