[c] arctan - program do sprawdzenia

0

Witam
Napisałem program, który liczy arctan (rozwiniecie w szereg) ale jest problem z błędem względnym bo wychodzi za duży. Proszę o sprawdzenia kodu i o pomoc w modyfikacji.

#include <stdio.h>
#include <math.h>
#define PI 3.1415926535

int sgn(double x){
    if(x>0) return 1;
    if(x<0) return -1;
}


double arctg(double x){
       double suma;
       double wyraz;
       int znak;
       int n = 1;

       if(abs(x)<=1){
          suma = 0;
          wyraz = x;
          znak = -1;

          do{
                 suma=suma+wyraz;
                 wyraz=wyraz*znak*((2*n-1)*x*x)/(2*n+1);
                 znak=znak*(-1);
                 n++;
         }while(fabs(wyraz)>1e-7);

         return suma;
       }

       else{
          suma = sgn(x)*(PI/2);
          wyraz = -1/x;
          znak = -1;

          do{
               suma=suma+wyraz;
               wyraz=wyraz*znak*1/(((2*n-1)*x*x)/(2*n+1));
               znak=znak*(-1);
               n++;
               }while(fabs(wyraz)>1e-7);
               return suma;
       }



}

int main(void){
    double x=-10;
    printf("%d\n\n",sgn(x));
    printf("\tx \t arctan \t  atan \t\t blad wzgledny\n");
    while(x<10){
       printf("%f \t %7.7f \t %6.8f \t %6.8f \n", x, arctg(x), atan(x),
fabs(arctg(x)-atan(x))/fabs(atan(x)));
       x+=1;
    }
       getchar();
       getchar();
}

Pozdrawiam

0

1
sgn(0.0) ??????

2
arctg(1.0) ??????

3
*if(abs(x)<=1) może lepiej na ostro

4
suma=suma+wyraz;
wyraz=wyrazznak
((2n-1)xx)/(2n+1);
znak=znak(-1);
*n++;
ładniej
suma += wyraz/(2n+1)
wyraz = -xx
a nawet
suma += wyraz / n
wyraz *= -x2
n+=2

5
bardzo wolno zbieżny gdy |x| bliskie 1,

6 !!!
*}while(fabs(wyraz)>1e-7)
}while(abs(suma-sumapop)>1e-7

7
pozdrawiam

1 użytkowników online, w tym zalogowanych: 0, gości: 1