-------------------------------------------------------------------------
 MAC-115  - Turma T23 -  Setembro  - Variaveis do tipo double - series
=========================================================================
   Variaçoes sobre o mesmo tema - calculo de  arctan(.)
   ====================================================

/* 
 * Exercicio 4.5 (parte a) -- em vez de funcao, foi feito um programa. 
 * 
 * arquivo: arctan-eps.c
 * ---------------------
 * Dada uma precisao eps = 0.0001 e um número x (real, a ser lido),
 * calcular arctan(x),  atraves da série, fazendo a soma até que o 
 * o termo a ser desprezado seja em valor absoluto menor que eps.
 *
 * x - x^3 / 3 + x^5 / 5 - x^7 / 7 + ...
 * 
 */

#include <stdio.h>
#include <math.h>  // para usar a funcao fabs(.)
int main()
{
  int i;
  double x, eps, termo, potx, soma;

  eps = 0.0001;  // precisao a ser usada 

  printf("Forneca o valor de x: ");
  scanf("%lf", &x);

  potx = x;
  soma = termo = x; 
  i = 3; 

  while (fabs(termo) >= eps){
    potx = - potx *  x * x;   // veja o sinal - 
    termo =  potx / i;
    soma = soma +  termo;
    i = i + 2;                // i toma valores 3, 5, 7....
  }

  printf("arctan(%g) = %.20g\n", x, soma);
  return 0;
}

================================================================
======= Solucao 2 definindo eps como constante (veja o #define)

/* 
 * Exercicio 4.5 (parte a) -- em vez de funcao, foi feito um programa. 
 * 
 * arquivo: arctan-eps-const.c
 * ---------------------------
 * Dada uma precisao eps = 0.0001 e um número x (real, a ser lido),
 * calcular arctan(x),  atraves da série, fazendo a soma até que o 
 * o termo a ser desprezado seja em valor absoluto menor que eps.
 *
 * x - x^3 / 3 + x^5 / 5 - x^7 / 7 + ...
 * 
 * Note que a precisao eps foi definida como uma constante
 * neste caso, nao se declara o eps. A inicializacao e' feita antes do
 * uso no programa principal.
 */

#include <stdio.h>
#include <math.h>   // para usar a funcao fabs(.)
#define eps  0.0001 // constante correspondente à precisao 

int main()
{
  int i;
  double x, termo, potx, soma; // note que eps nao e' declarado como variavel

  printf("Forneca o valor de x: ");
  scanf("%lf", &x);

  potx = x;
  soma = termo = x; 
  i = 3; 

  while (fabs(termo) >= eps){  // note que eps ja' foi definido
    potx = - potx *  x * x;  
    termo =  potx / i;
    soma = soma +  termo;
    i= i + 2;               
  }

  printf("arctan(%g) = %.20g\n", x, soma);
  return 0;
}

==================================================================
========== Solucao 3 fazendo a leitura de eps:

/* 
 * Exercicio 4.5 (parte a) -- em vez de funcao, foi feito um programa. 
 * 
 * arquivo: arctan-eps-lido.c
 * --------------------------
 * Dado um número x (real) e uma precisão eps (real),
 * calcular arctan(x),  atraves da série, fazendo a soma até que o 
 * o termo a ser desprezado seja em valor absoluto menor que eps.
 *
 * x - x^3 / 3 + x^5 / 5 - x^7 / 7 + ...
 * 
 */

#include <stdio.h>
#include <math.h>  // para usar a funcao fabs(.)

int main()
{
  int i;
  double x, eps, termo, potx, soma;

  printf("Forneca o valor de x: ");
  scanf("%lf", &x);

  printf("Forneca o valor de eps: ");
  scanf("%lf", &eps);

  potx = x;
  soma = termo = x; 
  i = 3; 

  while (fabs(termo) >= eps){ 
    potx = - potx *  x * x;   
    termo =  potx / i;
    soma = soma +  termo;
    i = i + 2;                
  }

  printf("arctan(%g) = %.20g\n", x, soma);
  return 0;
}

===================================================

OBS: Usando arctan(.) pode-se calcular uma aproximação para pi
     Basta notar que que pi = 4* arctan(1.0).
     
===============================================================

/*
 * arquivo: cos.c
 * Dados x real e n natural, calcular uma aproximação para cos(x)
 * através dos n primeiros termos da série.
 * Esta aproximacao é boa só em torno do zero. 
 */

#include <stdio.h>
#include <math.h>  //  para fazer o calculo de cos(x) usando a funcao cos(.)
                  // da biblioteca math.  Veja o ultimo printf.
int main()
{
    int n, k;
    double fatorial, x, cosx, termo;
                   // Veja: fatorial declarado como 'double'
    printf("Forneça o valor do ângulo em radianos: ");
    scanf("%lf", &x);
    printf("Número de termos: ");
    scanf("%d", &n);
    cosx = 1.0;
    fatorial = 1.0; 
    termo = 1.0;
    for (k = 1; k < n; k++) {
        termo =  - (termo * x * x); // veja o sinal 
        fatorial = fatorial * (2 * k -1) * (2 * k); //<==== calculo do fatorial
                                          // aproveitando o fatorial anterior.
        cosx = cosx + termo/fatorial;   
       
    }
    printf("cos(%g) = %g\n", x, cosx);
    printf("Usando a funcao cos(.) ja' disponivel:  cos(%g) = %g\n", x, cos(x));
    return 0;
}

==========================================================

/*
 * arquivo: cos.c
 * Dados x real e n natural, calcular uma aproximação para cos(x) através dos n
 * primeiros termos da série.
 * Aproximacao boa em torno do zero. <=========
 */

#include <stdio.h>
#include <math.h>  // <=== para fazer o calculo de cos(x) usando a funcao cos(.)
                        // da biblioteca math.  Veja o ultimo printf.
int main()
{
    int n, k;
    double fatorial, x, cosx, termo;
                   // Veja: fatorial declarado como 'double'
    printf("Forneça o valor do ângulo em radianos: ");
    scanf("%lf", &x);
    printf("Número de termos: ");
    scanf("%d", &n);
    cosx = 1.0;
    fatorial = 1.0; 
    termo = 1.0;
    for (k = 1; k < n; k++) {
        termo =  - (termo * x * x); // veja o sinal 
        fatorial = fatorial * (2 * k -1) * (2 * k); //<==== calculo do fatorial
                                          // aproveitando o fatorial anterior.
        cosx = cosx + termo/fatorial;   
       
    }
    printf("cos(%g) = %g\n", x, cosx);
    printf("Usando a funcao cos(.) ja' disponivel:  cos(%g) = %g\n", x, cos(x));
    return 0;
}