我正在尝试使用泰勒系列公式计算cos x
的值
infinity
---- 2k
\ k x
cos(x) = / (-1) * -------------
---- (2k)!
k=0
图形显示
这是我的计划。
#include "stdafx.h"
#include <iostream>
#include <string>
#include <cmath>
using namespace std;
int _tmain(int argc, _TCHAR* argv[])
{
double sum=0.0,sum1=0.0;
double x;
cin>>x;
for(int i=0 ; i<=10 ; i=i+1 )
{
for(int i=1 ; i<=20 ; i=i+1)
{
sum1=i*sum1+sum1;
}
sum=pow(-1,(double)i)*pow(x,(double)(2*i))/sum1+sum;
}
cout<<"Sum : "<<sum<<endl;
system("pause");
return 0;
}
输出为-1。#IND
为什么?
如何更改“sum1”的顺序才能使其正常工作?
答案 0 :(得分:2)
您正在使用i
作为两个互相嵌套的for循环的控制变量的名称。这不会按照你期望的方式运作。
接下来,sum1
为0.无论多少次乘以零并将零加零,它仍然为零。然后你除以零,这就是为什么你的最终答案是NaN
(非数字)。
您需要修复阶乘计算。为什么不首先编写一个阶乘函数并自行测试呢?
答案 1 :(得分:1)
你在内循环中重新定义了我。
for(int i=0 ; i<=10 ; i=i+1 )
{
for(int i=1 ; i<=20 ; i=i+1)
我做完C已经有一段时间了,但我很确定这是一个错误。
答案 2 :(得分:1)
很多事情都有点奇怪。 首先:请写ANSI C ++并尽量不采用微软的东西,我真的不知道,但我想那些是专业人士的。让我们坚持基本的东西。 这是你应该做的:
#include <iostream>
#include <string>
#include <cmath>
using namespace std;
double factorial(double fac)
{
if(fac == 0)
return 1;
return fac * factorial(fac - 1);
}
int main(int argc, char* argv[])
{
double sum=0.0;
double x;
cin >> x;
for ( int i = 0 ; i <= 10 ; i++ )
{
double divisor = factorial ( 2 * i );
if(divisor != 0.0)
{
sum += (double)( (pow( -1 , i ) * pow (x , 2*i )) / divisor );
}
}
cout<<"Sum : "<<sum<<endl;
//system("pause");
return 0;
}
您不仅以奇怪的方式计算因子,而且您也没有正确使用数学运算符,并且您没有按照您的意愿执行数学计算。你编写的代码也很奇怪,因为它没有说清楚(根据我的理解,甚至对你来说都不是这样)。看看其他人评论的内容。他们是对的。
答案 3 :(得分:1)
除以0时,结果将变为无穷大(打印为-1.#IND
)
Muggen提供了一种很好的天真方式,每次重新计算整个阶乘,并使用pow
函数计算公式中的交替符号。但是,您可以更快地对此代码进行改进。
循环的一次迭代中的因子函数可以利用这样一个事实,即你已经在循环的先前迭代中增加了所需的大多数项。
指数(-1)^k
只是一种在加法和减法之间交替的方法 - 你可以通过在循环中每次迭代都有一个变量来替换它。 (除了我在这里展示的内容之外,还有其他方法可以做到这一点,重点是您不需要调用pow()
函数来执行此操作。)
其他权力函数x^(2k)
也可以同样的方式展开。
我删除了循环的第一次迭代,因为我可以在脑海中计算它(对于任何x
来说它是1.0),并将sum
的初始值设置为{ {1}}。这种方式1.0
永远不会乘以0。
试试这个
factorial
答案 4 :(得分:0)
您似乎没有正确计算阶乘。应该是
sum1 = 1.0;
for(int k=1 ; k<=i*2 ; k=k+1)
{
sum1 *= k;
}
请注意,factorial在你的外环i终止a,而不是固定数字20,当我是5时,你不需要20!,你想要(2 * 5)!。