Ir ao conteúdo
  • Comunicados

    • Gabriel Torres

      Seja um moderador do Clube do Hardware!   12-02-2016

      Prezados membros do Clube do Hardware, Está aberto o processo de seleção de novos moderadores para diversos setores ou áreas do Clube do Hardware. Os requisitos são:   Pelo menos 500 posts e um ano de cadastro; Boa frequência de participação; Ser respeitoso, cordial e educado com os demais membros; Ter bom nível de português; Ter razoável conhecimento da área em que pretende atuar; Saber trabalhar em equipe (com os moderadores, coordenadores e administradores).   Os interessados deverão enviar uma mensagem privada para o usuário @Equipe Clube do Hardware com o título "Candidato a moderador". A mensagem deverá conter respostas às perguntas abaixo:   Qual o seu nome completo? Qual sua data de nascimento? Qual sua formação/profissão? Já atuou como moderador em algo outro fórum, se sim, qual? De forma sucinta, explique o porquê de querer ser moderador do fórum e conte-nos um pouco sobre você.   OBS: Não se trata de função remunerada. Todos que fazem parte do staff são voluntários.
    • DiF

      Poste seus códigos corretamente!   21-05-2016

      Prezados membros do Fórum do Clube do Hardware, O Fórum oferece um recurso chamado CODE, onde o ícone no painel do editor é  <>     O uso deste recurso é  imprescindível para uma melhor leitura, manter a organização, diferenciar de texto comum e principalmente evitar que os compiladores e IDEs acusem erro ao colar um código copiado daqui. Portanto convido-lhes para ler as instruções de como usar este recurso CODE neste tópico:  
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

@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
Postado (editado)

na saida a função que eu criei não sai(ps:ja adicionei %lf )

1.png

Editado por Antonio_FPS

Compartilhar este post


Link para o post
Compartilhar em outros sites

@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

@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

@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

@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
Postado (editado)

@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!

Editado por giu_d
Fazer uma complementação na explicação

Compartilhar este post


Link para o post
Compartilhar em outros sites

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






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

×