Ir ao conteúdo
  • Cadastre-se
Antonio_FPS

C calcular seno com função propria

Recommended Posts

Calcule seno(x), x em radianos, usando sua própria função: double seno(double x, double eps), a partir da série seno_x =  x/(1!) - x3/(3!) + x5/(5!) - ..... Teste para valores conhecidos e compare com o resultado da função double sin(double) da biblioteca da linguagem. Use precisão eps=0.0000001. Podem me ajudar estou tendo problemas com esse exercicio

#include <stdio.h>
#include <stdlib.h>
#include <math.h>

double seno(double x,double eps);
int main()
{double x,eps;
printf("insira em radianos o seno que deseja encontrar:");
scanf("%f",&x);
printf("seno(math.h):\t%f",sin(x));
printf("seno(funcao):\t%f",seno(x,eps));

  
system("PAUSE");    
return 0;
}
double seno(double x,double eps)
{double seno_x,seno_x1,i;
i=2;
seno_x=x;
eps=x;
do
{
seno_x=seno_x1;
seno_x1 =  seno_x*(x*x/i*(i+1));
eps=eps+seno_x1;
i=i+2;
}while (eps>0.0000001);
}
Nao estou conseguindo fazer a funçao funcionar

Compartilhar este post


Link para o post
Compartilhar em outros sites
Visitante

@Antonio_FPS  Olá. A princípio só uma correção: Você está trabalhando com valores do tipo double. Logo, para fazer a leitura de um valor desse tipo seria isso:

 

scanf("%lf", &x);

 

Compartilhar este post


Link para o post
Compartilhar em outros sites
Visitante

@Antonio_FPS  O problema então está na sua função

adicionado 8 minutos depois

Perceba que no main você cria a variável do tipo double eps e, mesmo sem atribuir nenhum valor a ela, você passa ela como parâmetro ao chamar sua função 

adicionado 56 minutos depois

@Antonio_FPS  só uma pergunta. O q seria o eps?

Compartilhar este post


Link para o post
Compartilhar em outros sites
Visitante

@Antonio_FPS  Tem um outro ponto. Sua função deve ter o tipo de retorno double e você não está retornando nada

Compartilhar este post


Link para o post
Compartilhar em outros sites

90 radianos? O número deveria ser entre 0 e 2PI (~ 6.2831853071)...

 

@giu_d eps provavelmente se refere a épsilon a letra grega, que é usada para designar a precisão usada, e imagino que a função deva receber a precisão como parâmetro e usar ela para definir quando para de calcular.

https://pt.wikipedia.org/wiki/Épsilon_de_máquina

 

Compartilhar este post


Link para o post
Compartilhar em outros sites
Visitante

@isrnick  Obrigado pela explicação.

Também pensei em algo assim: essa precisão ser passada como parâmetro.da função.

Se acaso tiver alguma sugestão para orientar o autor do tópico fique a vontade

Compartilhar este post


Link para o post
Compartilhar em outros sites

Mudei um pouco a função e consegui fazer a mesma funcionar, obrigado pela ajuda

programa:

#include <stdio.h>
#include <stdlib.h>
#include <math.h>

double seno(double x);
int main()
{double x;
double y,z;
printf("Insira o grau cujo o seno deseja encontrar:");
scanf("%lf",&y);
x=y*3.14159265/180.0;
printf("\n%1.lf em radianos:\t%lf\n",y,x);
printf("\nSeno de %lf (funcao proposta):\t%lf",x,seno(x));
z=sin(x);
printf("\nSeno de %lf (math.h):\t\t%lf",x,z);


printf("\n\n");  
system("PAUSE");    
return 0;
}
double seno(double x)
{double novo,antigo,i,soma;
i=2;
soma=x;
novo=x;
do
{
antigo=novo;
novo=-antigo*(x*x/(i*(i+1)));
soma=soma+novo;
i=i+2;
}while(fabs(novo)>0.0000001);
return soma;
}
 

Sem título2.png

  • Curtir 1

Compartilhar este post


Link para o post
Compartilhar em outros sites
Visitante

@Antonio_FPS  Olá. Realmente sua função está funcionando agora. 

Mas ficou um certo ponto: No enunciado do exercício é falado como deve ser assinatura da sua função, que seria double seno(double x, double eps). Devemos fazer de acordo com o enunciado. Logo, se você pensar um pouco, vai saber como resolver seu exercício usando a assinatura para sua função de acordo com o enunciado.

Dica: Dê uma olhada nos comentários acima

adicionado 31 minutos depois

Se não está conseguindo resolver olhando para os comentários feitos avisa, ok?

 

adicionado 34 minutos depois
12 horas atrás, isrnick disse:

e imagino que a função deva receber a precisão como parâmetro e usar ela para definir quando para de calcular

 

Compartilhar este post


Link para o post
Compartilhar em outros sites
Visitante

@Antonio_FPS  Olá. Gostaria de dar uma breve explicação para se trabalhar com valores do tipo double

Para o caso de ler do teclado um valor desse tipo, já comentei aqui, mas apenas para reforçar:

 

scanf("%lf", &y);

Já para o caso de imprimir um valor do tipo double seria da mesma forma q um valor do tipo float.  

Veja nesse exemplo q peguei do seu exercício:

 

printf("\nSeno de %f (funcao proposta):\t%f", x, seno(x, eps));

Como pode ver, para o caso de impressão não é necessário o "%lf" .

Se quiser usar formatação, como, por ex,  definir quantas casas decimais você quer mostrar, seria bem simples.

Nesse exemplo fictício estou querendo imprimir os valores do tipo double com apenas com 2 casas decimais:

 

printf("\nSeno de %.2f (funcao proposta):\t%.2f", x, seno(x, eps));

Onde o número 2 depois do ponto equivale a quantidade de casas decimais.

Se fosse com 10 casas decimais, seria isso: %.10f 

Se deu para entender o q procurei passar ok! Se acaso ficou alguma dúvida fique a vontade para perguntar

Obs: Caso o valor em questão fosse do tipo long double, aí sim seria preciso fazer uso do %lf para impressão, mas esse não é o foco dessa explicação e se deu para entender o q foi passado com relação a valores do tipo double ótimo!

Compartilhar este post


Link para o post
Compartilhar em outros sites
Visitante

Se alguém tiver sugestões para passar para o autor do tópico fique a vontade p postar

Compartilhar este post


Link para o post
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisar ser um membro para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar agora





Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas publicações sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×