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++。这对我来说是最重要的。没问题!当我们开始使用新的语言时,这对我们所有人都有好处。