Duvida calculo funçao seno, C++

Boas!
Estou a tentar desenvolver um programa q calcule o valor do seno através da série de taylor.
Ate agora estava tudo a correr bem, contudo o programa apresenta sempre sen(x)=0, mesmo em angulos como 90 graus.
aqui esta o troço do codigo(vou por apenas as funçoes q sao chamadas)

Código:
#include <stdio.h>
#include<math.h>

double angulo_r, n, angulo_g, h, ValorSeno;
int termo;



long long factorial(int h)
{
   long long fact=1;

   for(int i=1; i<=h; i++)
   {
      fact*=i;
   }
   return fact;

printf("Introduza o valor do angulo em RADIANOS\n");
scanf_s(" %lf", &angulo_r);

printf("\nIndique o numero de termos que devera ter a serie de \n");
printf("\nTaylor para o calculo das funcoes seno, cosseno e tangente.\n");
scanf_s(" %d", &n);


for(int termo=1;termo<=n;termo++)
    {
        ValorSeno= ValorSeno + (pow(-1.0, termo))/factorial((2*termo)+1)*pow(angulo_r,(2*termo+1));
    }

printf("%lf\n\n", ValorSeno);

Se alguem me puder ajudar, agradecia imenso!


Cumprimentos e votos de um bom 2010!
 
Última edição pelo moderador:
Boas!
Estou a tentar desenvolver um programa q calcule o valor do seno através da série de taylor.
Ate agora estava tudo a correr bem, contudo o programa apresenta sempre sen(x)=0, mesmo em angulos como 90 graus.
aqui esta o troço do codigo(vou por apenas as funçoes q sao chamadas)

Código:
#include <stdio.h>
#include<math.h>

double angulo_r, n, angulo_g, h, ValorSeno;
int termo;



long long factorial(int h)
{
   long long fact=1;

   for(int i=1; i<=h; i++)
   {
      fact*=i;
   }
   return fact;

printf("Introduza o valor do angulo em RADIANOS\n");
scanf_s(" %lf", &angulo_r);

printf("\nIndique o numero de termos que devera ter a serie de \n");
printf("\nTaylor para o calculo das funcoes seno, cosseno e tangente.\n");
scanf_s(" %d", &n);


for(int termo=1;termo<=n;termo++)
    {
        ValorSeno= ValorSeno + (pow(-1.0, termo))/factorial((2*termo)+1)*pow(angulo_r,(2*termo+1));
    }

printf("%lf\n\n", ValorSeno);
Se alguem me puder ajudar, agradecia imenso!


Cumprimentos e votos de um bom 2010!


Acho que o teu problema está aqui em vez de

ValorSeno= ValorSeno + (pow(-1.0, termo))/factorial((2*termo)+1)*pow(angulo_r,(2*termo+1));

deves querer:

ValorSeno= ValorSeno + (pow(-1.0, termo)*pow(angulo_r,(2*termo+1)))/factorial((2*termo)+1);

mas mesmo assim acho que tens um erro na fórmula da série de Taylor, isso não devia ser:

sin(x) = x + (-1)^n (x^n)/n!

Atenção que não experimetei o código e o que digo fórmula da série de Taylor é de cabeça portanto posso estar errado.
 
Na realidade é igual, visto que ter x*y/z é igual a ter x/z*y.


Quanto ao código, não me deu sempre zero, mas confesso que não fui confirmar os resultados.

Código:
#include <stdio.h>
#include <math.h>





long long factorial(int h)
{
    long long fact=1;

    for(int i=1; i<=h; i++)
    {
        fact*=i;
    }
    return fact;
}

int main () {

    float angulo_r, n, angulo_g, h, ValorSeno;
    int termo;

    printf("Introduza o valor do angulo em RADIANOS\n");
    scanf(" %f", &angulo_r);

    printf("\nIndique o numero de termos que devera ter a serie de \n");
    printf("\nTaylor para o calculo das funcoes seno, cosseno e tangente.\n");
    scanf(" %f", &n);


    for(int termo=1;termo<=n;termo++)
    {
        ValorSeno= ValorSeno + (pow(-1.0, termo))/factorial((2*termo)+1)*pow(angulo_r,(2*termo+1));
    }

    printf("%lf\n\n", ValorSeno);

    return 0;
}

Fiz apenas umas alterações porque não estava a conseguir compilar.

PS: isto não é C++, mas sim C :p
 
sir_atmc

x*y/z não tem nada a ver com x/y*z

o primeiro é (x*y)/z e o segundo é (x/y)*z

dando um exemplo:

x = 2
y = 3
z = 4

x*y/z = 1.5
x/y*z = 2.6667

outra coisa que reparei depois de ter ido ver a página da wikipedia sobre a série de taylor é que o somatório começa em 0 e não em 1 como tens no for, se mudares isso ja deve dar.

Mais um pormenor não sei quantos termos queres calcular mas cuidado com o tamanho dos floats que não é assim tão grande como isso para um série de taylor.

Cheers
 
Última edição:
Ao compilar o programa que o user sir_atmc tem no seu comentario, deu-me um erro pois faltava inicializar a variavel ValorSeno, apos por a variavel "ValorSeno =0", consegui compilar e embora nao tenho verificado os valores para saber se estao certos, pelo menos o programa ja compila e se houver erros e na formula. Como dizes que a formula esta bem, esta resolvido, o sir_atmc resolveu-te o problema.
 
sir_atmc

x*y/z não tem nada a ver com x/y*z

o primeiro é (x*y)/z e o segundo é (x/y)*z

dando um exemplo:

x = 2
y = 3
z = 4

x*y/z = 1.5
x/y*z = 2.6667

outra coisa que reparei depois de ter ido ver a página da wikipedia sobre a série de taylor é que o somatório começa em 0 e não em 1 como tens no for, se mudares isso ja deve dar.

Mais um pormenor não sei quantos termos queres calcular mas cuidado com o tamanho dos floats que não é assim tão grande como isso para um série de taylor.

Cheers

Ele devia querer dizer que x*y/z era igual a x/z*y.

E disse-o :p

Na realidade é igual, visto que ter x*y/z é igual a ter x/z*y.
(...)

Penso que houve aí alguma confusão :p
 
Pessoal, entretanto surgiu-me uma nova duvida.
Ja com tudo a funcionar, implementei a serie de taylor na funçao seno, mas os valores estao a sair mal, embora pareça q a serie esta bem posta no codigo.



long long factorial(int h)
{
long long fact=1;

for(int i=1; i<=h; i++)
{
fact*=i;
}
return fact;
}

while(termo<= n)
{
ValorSeno+=pow(-1.0, termo)*(pow(angulo_r, 2*termo+1)/factorial(2*termo+1));
termo++;
}



Se alguem me puder ajudar, ficaria imensamente grato!
Cumps!
 
double angulo_r, angulo_g, ValorSeno=0;
int termo=0, n;



long long factorial(int h)
{
long long fact=1;

for(int i=1; i<=h; i++)
{
fact*=i;
}
return fact;

int main()
{
printf("bota la o factorial!\n");
scanf_s("%d", &n);
printf("%d\n\n\n", factorial(n));
return 0;
}


bem pessoal, ja detectei aqui um erro no calculo do factorial!
Por exemplo, para 14!, que deveria dar 87178291200, o valor q da e 1278945280....

Se alguem me puder ajudar com este grande problema agradecia, pois pode ser isto q esta a dar cabo do calculo do seno!
Desculpem la as falhas de novato loool.

Cumps!
 
Última edição:
Eu não tou a ver problema nenhum com a função mas experimenta a forma recursiva, para ver se o resultado é diferente.

long long rFactorial( int f)
{
if( f >= 1)
return f * rFactorial( f-1);
else
return 1;
}

Cheers
 
Assim da o mesmo erro.
Eu acho e q o long long nao e grande o suficiente pra apresentar o numero.
Nao sei se me estou a fazer entender.

Se me conseguirem ajudar, agradecia imenso!
Cumps!
 
Se o long não for suficiente usa o double.

Podes também experimentar unsigned long long (tem o dobro da gama do long long).
 
Última edição:
Alguem me ajuda com esse bug? Calcular uma função que calcula o sen(x) baseado na série de Maclaurin

#include<stdio.h>
#include<iostream>
#include<cmath>
#include<stdlib.h>
using namespace std;
int fatorial(int n)
{
int a, resposta=1;
for(a=n;a>1;a--)
resposta*=a;
return resposta;
}
double Sen_x(double x, int precisao)
{
int i;
double resposta=0;
for(i=0;i<precisao;i++)
{
cout << "Adicionando "<<(pow((-1),i)*pow(x,(2*i+1)))/fatorial(2*i+1)<<"\n";
resposta+=(pow((-1),i)*pow(x,(2*i+1)))/fatorial(2*i+1);
cout << "Valor da resposta atual "<<resposta<<"\n";
}
return resposta;
}
double converter_pra_rad(double grau)
{
while(grau>=360)
grau-=360;
if(grau>=270)
grau-=270;
if(grau>=180)
grau-=180;
if(grau>90)
grau-=90;
return (2*M_PI*grau)/360;
}
int main()
{
double x=0;
cout << "Insira o valor do arco de sen(x):(em graus)\n";
cin >> x;
double grau=x;
int modificador=1;
while(grau>=360)
grau-=360;
if(grau>=180)
modificador=-1;
double sen_x=modificador*Sen_x(converter_pra_rad(x),17);
cout << "Sen("<<x<<") ="<<sen_x<<"\n";
return 0;
}
 
Código:
#include <stdio.h>
#include <iostream>
#include <cmath>
#include <stdlib.h>
using namespace std;

unsigned long long int fatorial(int n)
{
  unsigned long long int a, resposta=1;
  for(a=n;a>1;a--)
    resposta*=a;
  return resposta;
}
double Sen_x(double x, int precisao)
{
  int i;
  double resposta=0;
  for(i=0;i<precisao;i++)
  {
    resposta += (pow((-1),i)*pow(x,(2*i+1)))/fatorial(2*i+1);
  }
  return resposta;
}
double converter_pra_rad(double grau)
{
  if(grau>=180)
    grau-=180;
  return (2*M_PI*grau)/360;
}

int main()
{
  double x=0;
  cout << "Insira o valor do arco de sen(x):(em graus)\n";
  cin >> x;
  double grau = x;
  int modificador = 1;
  while(grau >= 360)
    grau -= 360;
  if(grau>=180)
    modificador = -1;   
  double sen_x = modificador * Sen_x(converter_pra_rad(grau), 17);
  cout << "Sen("<<x<<") = "<< sen_x << endl;
  return 0;
}

1º O seno de 91 é igual ao seno 89 e não de 1, logo o teu converter para rad tem problemas
2º Factorial pode ter números muito grandes, usar unsigned long long ou uint64_t (a partir de c++11) é importante.
3º Podias evitar algumas variáveis redundantes como o caso do grau e do x.
 
Back
Topo