C++ cout(C+;+;)的问题

C++ cout(C+;+;)的问题,c++,cout,C++,Cout,我最难弄清楚这里到底出了什么问题: #include <iostream> #include <cmath> #include <iomanip> using namespace std; double fact(double); double sinTaylor(double); double cosTaylor(double); int main() { double number, sineOfnumber, cosineOfnumber;

我最难弄清楚这里到底出了什么问题:

#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;
}
#包括
#包括
#包括
使用名称空间std;
双重事实(双重);
双倍辛塔伊勒(双倍);
双倍cosTaylor(双倍);
int main()
{
双数、正弦数、余弦数;
库特数;
sineOfnumber=sinTaylor(编号);
cosineOfnumber=cosTaylor(编号);

cout您是否初始化过函数中的变量sumSine和sumCosine?它们不能保证从零开始,因此当您在循环中调用+=时,您可能会将计算值添加到垃圾中


尝试将这两个变量初始化为零,看看会发生什么,因为代码似乎没有问题。

您是否在函数中初始化过变量sumSine和sumCosine?它们不能保证从零开始,因此当您在循环中调用+=时,您可能会将计算值添加到垃圾中


尝试将这两个变量初始化为零,看看会发生什么,因为代码似乎没有问题。

正弦的系列是(很抱歉:

如果你看,给定项t{2n+1},你可以把项t{2n+3}计算为

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

因此,给定一个项,你可以很容易地计算下一个项。如果你看余弦的级数,它是相似的。得到的程序更有效(无需重新计算阶乘)而且可能更精确。当将浮点数相加时,从最小值到最大值的相加更精确,但我怀疑这会造成不同。

正弦的系列是(很抱歉):

如果你看,给定项t{2n+1},你可以把项t{2n+3}计算为

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


因此,给定一个项,你可以很容易地计算下一个项。如果你看余弦的级数,它是相似的。得到的程序更有效(无需重新计算阶乘)而且可能更精确。当将浮点数相加时,从最小值到最大值的相加更精确,但我怀疑这会有什么不同。

带有
double
参数的阶乘函数和带有
double
计数器的for循环都是坏符号。是的,我知道。老实说,这真的让我很困扰要死的是,我真的不能让程序做它应该做的事情,除非所有的东西都是双精度的。这是不是导致cosineOfnumber打印错误的原因呢?可能是吧。是不是
pow
函数给了你一个难题?只要确保一个参数是双精度的。例如,
pow(-1,n)
试过了,没用。cosOfnumber仍然给我一个1.14。奇怪的是,注释sineOfnumber让cosOfnumber正常打印的行。出于某种原因,在我打印它们时,它将两者相加。带有
double
参数的阶乘函数和带有
double
计数器的for循环都是坏信号ns.是的,我知道。老实说,这真的让我烦死了,我真的不能让程序做它应该做的事情,除非所有的东西都是双精度的。这是不是导致cosineOfnumber打印错误的原因呢?可能是吧。是不是
pow
函数让你很为难?只要确保一个参数是双精度的。例如示例,
pow(-1,n)
试过了,没用。cosOfnumber仍然给我一个1.14。奇怪的是,在评论sineOfnumber让cosOfnumber正常打印的行时,由于某种原因,在我打印它们时,它将这两个元素添加到了一起。它起了作用!非常感谢你,说真的。作为最后一个请求,为什么这解决了我的问题?如果你不初始化C或C++变量不需要编译器为你做。在你的函数被调用时,你的双倍只填充了堆栈上的任何垃圾。这是我能在没有超技术的情况下给出的最好的描述。(如果你解决了问题,你能把答案标记为正确吗?)@ USER 2063355,因为如果未初始化,它可以从2或768或1565626开始。在这种情况下,它可能从其他函数调用中获得了堆栈上剩下的值,这就是为什么它看起来像是添加的。嗯,有趣。我标记它是正确的,并且感谢帮助一个相对新的家伙到C++。当我开始使用新的语言时,它会使我们大家都受益。非常感谢,非常认真。作为最后的请求,为什么这会解决我的问题?如果你没有初始化C或C++中的变量,编译器就不会强迫你去做。你的双倍只填充了堆栈上的任何垃圾。在调用你的函数的时候。这是我能给出的最好的描述,而不是超技术。(如果它解决了你的问题,你能把答案标记为正确吗?)@ USER 2063355,因为如果未初始化,它可以从2或768或1565626开始。在这种情况下,它可能从其他函数调用中获得了堆栈上剩下的值,这就是为什么它看起来像是添加的。嗯,有趣。我标记它是正确的,并且感谢帮助一个相对新的家伙到C++。这对我来说是最重要的。没问题!当我们开始使用新的语言时,这对我们所有人都有好处。