2

好的,这就是我到目前为止所拥有的:

#include <stdio.h>
#include <math.h>
//#define PI 3.14159

int factorial(int n){
  if(n <= 1)
    return(1);
  else
    return(n * factorial(n-1));
}

void McLaurin(float pi){
  int factorial(int);
  float x = 42*pi/180;
  int i, val=0, sign;

  for(i=1, sign=-1; i<11; i+=2){
    sign *= -1; // alternate sign of cos(0) which is 1
    val += (sign*(pow(x, i)) / factorial(i));
  }

  printf("\nMcLaurin of 42 = %d\n", val);
}

void Taylor(float pi){
  int factorial(int);
  float x;
  int i;
  float val=0.00, sign;
  float a = pi/3;

  printf("Enter x in degrees:\n");
  scanf("%f", &x);
  x=x*pi/180.0;
  printf("%f",x);

  for(i=0, sign=-1.0; i<2; i++){
    if(i%2==1)
      sign *= -1.0; // alternate sign of cos(0) which is 1
    printf("%f",sign);
    if(i%2==1)
      val += (sign*sin(a)*(pow(x-a, i)) / factorial(i));
    else
      val += (sign*cos(a)*(pow(x-a, i)) / factorial(i));
    printf("%d",factorial(i));
  }

  printf("\nTaylor of sin(%g degrees) = %d\n", (x*180.0)/pi, val);
}

main(){
  float pi=3.14159;
  void McLaurin(float);
  void Taylor(float);

  McLaurin(pi);
  Taylor(pi);
}

这是输出:

McLaurin of 42 = 0
Enter x in degrees:
42
0.733038-1.00000011.0000001
Taylor of sin(42 degrees) = -1073741824

我怀疑这些离谱数字的原因与我混淆了我的浮点数和整数的事实有关?但我就是想不通……!!也许它是数学的东西,但它从来都不是我的强项,更不用说用微积分编程了。麦克劳林也失败了,它怎么等于零?哇!请帮助纠正我的笨拙代码。我还是个初学者...

- - 更新 - -

#include <stdio.h>
#include <math.h>
//#define PI 3.14159

int factorial(int n){
  if(n <= 1)
    return(1);
  else
    return(n * factorial(n-1));
}

void McLaurin(float pi){
  int factorial(int);
  float x = 42*pi/180, val=0;
  int i, sign;

  for(i=1, sign=-1; i<11; i+=2){
    sign *= -1; // alternate sign of cos(0) which is 1
    val += (sign*(pow(x, i)) / factorial(i));
  }

  printf("\nMcLaurin of of sin(%f degrees) = %f\n", (x*180.0)/pi, val);
}

void Taylor(float pi){
  int factorial(int);
  float x;
  int i;
  float val=0, sign;
  float a = pi/3;

  printf("Enter x in degrees:\n");
  scanf("%f", &x);
  x=x*pi/180.0;
  printf("%f",x);

  for(i=0, sign=-1.0; i<2; i++){
    if(i%2==0)
      sign *= -1; // alternate sign of cos(0) which is 1
    printf("%f",sign);
    if(i%2==0)
      val += (sign*sin(a)*(pow(x-a, i)) / factorial(i));
    else
      val += (sign*cos(a)*(pow(x-a, i)) / factorial(i));
    printf("%d",factorial(i));
  }

  printf("\nTaylor of sin(%f degrees) = %f\n", (x*180.0)/pi, val);
}

main(){
  float pi=3.14159;
  void McLaurin(float);
  void Taylor(float);

  McLaurin(pi);
  Taylor(pi);
}

给我奇怪的错误。

/usr/lib/gcc/i686-pc-cygwin/3.4.4/../../../../i686-pc-cygwin/bin/ld: cannot open output file a.exe: Device or resource busy
collect2: ld returned 1 exit status
Can anyone explain what's wrong now?
4

3 回答 3

1

有几件事跳出来:

  1. McLauren您将 val (您的计算值)定义为 int 时。尝试将其定义为浮点数
  2. 因为Taylor你只是每隔一次翻转你的标志,所以它变成-1、1、-1、-1、1、1 ....等等
  3. 我认为你的泰勒级数公式不正确,在维基百科上刷新自己之后,你不应该打电话sincos(因为那是你想要计算的)

祝你好运!

于 2010-05-27T18:50:14.347 回答
1

一些潜在的错误来源:

  • 您的 pi 值没有足够的数字来保证浮点精度;
  • 在您的函数 Maclaurin 中,您将 val 作为整数,在其上执行除法;
  • 在泰勒中,您仅在系列中使用 2 个术语

我认为 ?

于 2010-05-27T18:49:46.633 回答
1

已经提到的这个肯定很麻烦:

  • val 应该是 McLaurin() 中的浮点数

此外,在使用 printf() 打印出您的 s时,您需要使用%for%g而不是。这就是你得到如此疯狂数字的最终原因:浮点数被解释为整数。%dval

此外,在 Taylor() 中,您需要将两个 if 语句更改为

if(i%2==0)

因为你是泰勒扩展罪,而不是 cos。

使用与代码中相同数量的术语,执行这些操作分别为 MacLaurin 和 Taylor 系列答案产生 0.669130 和 0.708945。如果我在泰勒级数答案中再添加两个项(使用 i<4 而不是 i<2),我得到 0.668793。真正的答案(使用与您使用的相同的 pi)是 0.669130,泰勒级数的答案是添加了另外 3 个附加项。

于 2010-05-27T19:19:48.583 回答