怎么了?如何更改“sum1”订单?

时间:2010-12-15 02:57:37

标签: c++

我正在尝试使用泰勒系列公式计算cos x的值

             infinity
             ----                  2k
             \            k      x
 cos(x) =    /        (-1)  * -------------
             ----                (2k)!
             k=0

http://ppt.cc/G,DC

图形显示

这是我的计划。

#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”的顺序才能使其正常工作?

5 个答案:

答案 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. 循环的一次迭代中的因子函数可以利用这样一个事实,即你已经在循环的先前迭代中增加了所需的大多数项。

  2. 指数(-1)^k只是一种在加法和减法之间交替的方法 - 你可以通过在循环中每次迭代都有一个变量来替换它。 (除了我在这里展示的内容之外,还有其他方法可以做到这一点,重点是您不需要调用pow()函数来执行此操作。)

  3. 其他权力函数x^(2k)也可以同样的方式展开。

  4. 我删除了循环的第一次迭代,因为我可以在脑海中计算它(对于任何x来说它是1.0),并将sum的初始值设置为{ {1}}。这种方式1.0永远不会乘以0。

  5. 试试这个

    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)!。