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

これらのとんでもない数の理由は、float と int を混同したという事実に関係しているのではないでしょうか? しかし、私はそれを理解することはできません... !! 多分それは数学のことかもしれませんが、微積分を使ったプログラムは言うまでもなく、それは私の強みではありませんでした。マクローリンも失敗しますが、どうしてゼロになるのでしょうか? なんてこった!私の初心者のコードを修正するのを手伝ってください。まだまだ初心者です…

- - アップデート - -

#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

エラーの潜在的な原因:

  • あなたのpiの値には、浮動小数点数の精度でさえも十分な桁数がありません。
  • 関数マクローリンでは、除算を実行する整数として val があります。
  • テイラーでは、シリーズで2つの用語のみを使用します

おもう ?

于 2010-05-27T18:49:46.633 に答える
1

いくつかのことが飛び出します:

  1. McLaurenval (計算値) を int として定義します。フロートとして定義してみてください
  2. あなたは1回おきにサインを反転しTaylorているだけなので、-1、1、-1、-1、1、1 ....などになります
  3. テイラー級数の式が間違っていると思います。ウィキペディアsinで自分自身をリフレッシュした後、 orを呼び出すべきではありませんcos(それが計算しようとしているからです)。

幸運を!

于 2010-05-27T18:50:14.347 に答える
1

すでに言及されているこれは間違いなく面倒です:

  • val は McLaurin() の float でなければなりません

さらに、printf() を使用して s を出力する場合は、代わりに%forを使用する必要があります。それが最終的に、このようなクレイジーな数値を取得する理由です。浮動小数点数は int として解釈されます。%g%dval

また、Taylor() では、2 つの if ステートメントを次のように変更する必要があります。

if(i%2==0)

cos ではなく sin を展開する Taylor であるためです。

これらのことを行うと、コードと同じ数の項を使用して、MacLaurin および Taylor 級数の回答に対してそれぞれ 0.669130 および 0.708945 が得られます。テイラー級数の答えにさらに 2 つの項を追加すると (i<2 の代わりに i<4 を使用)、0.668793 が得られます。真の答え (使用したのと同じ pi を使用) は 0.669130 で、Taylor 級数の答えにさらに 3 つの追加項が追加されます。

于 2010-05-27T19:19:48.583 に答える