Página Inicial do Fórum > Java Básico

Cálculo de Cosseno



Criar novo tópico   Responder tópico
  1. Comment Arrow

    Publicado em: 27/02/2010 19:34:32

    Olá galera!

    Meu professor lançou um desafio para o cálculo de cosseno que é o seguinte:

    Entrada N = número de termos da série depois do 1 (da fórmula do cosseno);
    Entrada X = ângulo em graus;

    Dado o ângulo x (em graus), calcular o cosseno.

    A fórmula é:

    cos(x) = 1 - x^2/2! + x^4/4! - x^6/6! + x^8/8! - ... e assim por diante até chegar ao número de termos que o usuário deseja (Entrada N)

    Obs.: O ângulo X na fórmula acima deve ser transformado em radianos para o cálculo.

    Eu cheguei ao seguinte código:





    O código compila, converte graus em radianos corretamente, mas não retorna o cosseno correto.

    Por exemplo, se testarmos com um ângulo de 45° ele retorna 0.785 em radianos e -0.30020 como cosseno, onde o cosseno correto seria 0.70738.

    Não consigo identificar o erro no código. Podem me ajudar?


    _________________



  1. flaviorcb
    Posts:2


    Comment Arrow

    Publicado em: 28/02/2010 03:05:51

    a variavel "operacao" tem de inicializar em -1, pois a serie é: 1-X^2/2!...



  1. simu
    Posts:9417


    Comment Arrow

    Publicado em: 28/02/2010 08:40:52

    flaviorcb
    a variavel "operacao" tem de inicializar em -1, pois a serie é: 1-X^2/2!...


    1) como ele faz "1-cos" no final, o valor de "operacao" está correto, mas
    2) o valor de "operacao" não tem efeito nenhum no cálculo...
    []]

    EDIT 2010-03-01:
    o ponto 2 acima está errado, o valor de "operacao" tem efeito, como notado pelo colega mais abaixo.
    3) o valor inicial de "cos" está errado (ou o "cos = 1-cos" no final)
    _________________
      Nome real: Carlos F. Heuberger

    Removeram os meus direitos de administrador e moderador - sem aviso, pela segunda vez - contate o ombudsman (?), a equipejavafree ou a "alta gerência" se necessário - Que pena... que terminou dessa maneira!

    "The mod javafree deserves, but not the one it needs right now."
    --------------------
    Não leio nem respondo MPs!
    This posting is provided AS IS with no warranties and confers no rights.



  1. simu
    Posts:9417


    Comment Arrow

    Publicado em: 28/02/2010 08:40:52

    Aconselho voce adicionar uns println ou usar o debugger para verificar os valores gerados. Estranhei voce usar o Math.pow e não usar o Math.cos diretamente (dica: é fácil evitar o uso do Math.pow: x^2 = x*x; x^4=x*x*x*x)... O cálculo do fatorial tambem está com falhas... melhor seria voce tentar "rodar o programa no papel" tá parecendo muito que voce copiou vários trechos de fontes diferentes...
    Exemplo, voce faz "cos = 1" e no fim faz "cos = 1 - cos" ???

    []]

    Thiago Bottoni
    Olá galera!

    Meu professor lançou um desafio para o cálculo de cosseno que é o seguinte:

    Entrada N = número de termos da série depois do 1 (da fórmula do cosseno);
    Entrada X = ângulo em graus;

    Dado o ângulo x (em graus), calcular o cosseno.

    A fórmula é:

    cos(x) = 1 - x^2/2! + x^4/4! - x^6/6! + x^8/8! - ... e assim por diante até chegar ao número de termos que o usuário deseja (Entrada N)

    Obs.: O ângulo X na fórmula acima deve ser transformado em radianos para o cálculo.

    Eu cheguei ao seguinte código:





    O código compila, converte graus em radianos corretamente, mas não retorna o cosseno correto.

    Por exemplo, se testarmos com um ângulo de 45° ele retorna 0.785 em radianos e -0.30020 como cosseno, onde o cosseno correto seria 0.70738.

    Não consigo identificar o erro no código. Podem me ajudar?


    _________________
      Nome real: Carlos F. Heuberger

    Removeram os meus direitos de administrador e moderador - sem aviso, pela segunda vez - contate o ombudsman (?), a equipejavafree ou a "alta gerência" se necessário - Que pena... que terminou dessa maneira!

    "The mod javafree deserves, but not the one it needs right now."
    --------------------
    Não leio nem respondo MPs!
    This posting is provided AS IS with no warranties and confers no rights.

  1. Comment Arrow

    Publicado em: 27/02/2010 19:34:32

    simu
    Aconselho voce adicionar uns println ou usar o debugger para verificar os valores gerados. Estranhei voce usar o Math.pow e não usar o Math.cos diretamente (dica: é fácil evitar o uso do Math.pow: x^2 = x*x; x^4=x*x*x*x)... O cálculo do fatorial tambem está com falhas... melhor seria voce tentar "rodar o programa no papel" tá parecendo muito que voce copiou vários trechos de fontes diferentes...
    Exemplo, voce faz "cos = 1" e no fim faz "cos = 1 - cos" ???



    Não usei o Math.cos() diretamente, pois o desafio é justamente calcular o cosseno de acordo com a fórmula dada.

    O Math.pow() no código só auxilia, não entendi porque evitá-lo.

    Realmente o cálculo do fatorial estava errado, pois estava fazendo o fatorial de tudo antes do cálculo, quando na verdade queremos o cálculo de um por vez, de acordo com o expoente. Obrigado!

    Não copiei o código de nenhuma fonte!

    Dei uma melhorada no código e estou obtendo resultados mais próximos do esperado, mas ainda não está correto.



    Mais alguma sugestão?

    Obrigado pela ajuda!

    _________________



  1. simu
    Posts:9417


    Comment Arrow

    Publicado em: 28/02/2010 08:40:52

    Thiago Bottoni
    simu
    Aconselho voce adicionar uns println ou usar o debugger para verificar os valores gerados. Estranhei voce usar o Math.pow e não usar o Math.cos diretamente (dica: é fácil evitar o uso do Math.pow: x^2 = x*x; x^4=x*x*x*x)... O cálculo do fatorial tambem está com falhas... melhor seria voce tentar "rodar o programa no papel" tá parecendo muito que voce copiou vários trechos de fontes diferentes...
    Exemplo, voce faz "cos = 1" e no fim faz "cos = 1 - cos" ???



    Não usei o Math.cos() diretamente, pois o desafio é justamente calcular o cosseno de acordo com a fórmula dada.

    O Math.pow() no código só auxilia, não entendi porque evitá-lo.

    Realmente o cálculo do fatorial estava errado, pois estava fazendo o fatorial de tudo antes do cálculo, quando na verdade queremos o cálculo de um por vez, de acordo com o expoente. Obrigado!

    Não copiei o código de nenhuma fonte!

    Dei uma melhorada no código e estou obtendo resultados mais próximos do esperado, mas ainda não está correto.



    Mais alguma sugestão?

    Obrigado pela ajuda!


    evitar o Math.pow:
    1) operação demorada, (não muito) erro arredondamento/cálculo e fácil de substituir
    2) normalmente os professores não permitem o use de bibliotecas.

    mas ficou bastante melhor, mas achei um problema:
    o fatorial ainda está errado: exp é incrementado de 2!
    Está calculando "fat=1*2*4*6..."

    Dica: "3.14" é meio impreciso... porque não usar Math.PI se for permitido? (Math.toRadians() seria mais "legal", mas provavelmente parte da tarefa...)
    []]
    _________________
      Nome real: Carlos F. Heuberger

    Removeram os meus direitos de administrador e moderador - sem aviso, pela segunda vez - contate o ombudsman (?), a equipejavafree ou a "alta gerência" se necessário - Que pena... que terminou dessa maneira!

    "The mod javafree deserves, but not the one it needs right now."
    --------------------
    Não leio nem respondo MPs!
    This posting is provided AS IS with no warranties and confers no rights.

  1. Comment Arrow

    Publicado em: 27/02/2010 19:34:32

    simu
    evitar o Math.pow:
    1) operação demorada, (não muito) erro arredondamento/cálculo e fácil de substituir
    2) normalmente os professores não permitem o use de bibliotecas.

    mas ficou bastante melhor, mas achei um problema:
    o fatorial ainda está errado: exp é incrementado de 2!
    Está calculando "fat=1*2*4*6..."

    Dica: "3.14" é meio impreciso... porque não usar Math.PI se for permitido? (Math.toRadians() seria mais "legal", mas provavelmente parte da tarefa...)
    []]



    Entendi! Mas o objetivo é resolver o desafio não usando o Math.cos(). Outros métodos da classe java.lang.Math podem ser usados. Inclusive usei o Math.toRadians() para converter graus para radianos e obter uma melhor precisão na conta, como você sugeriu.

    Resumindo, o código agora está certo e vou postar abaixo para ajudar mais alguém que tenha a mesma dúvida.

    Obrigado!


    _________________



  1. flaviorcb
    Posts:2


    Comment Arrow

    Publicado em: 28/02/2010 03:05:51

    Gostei do problema entao resolvi implementar, ja esta testado, observe que quando e para dar zero, da tipo 2.34E-17 que é mt proximo de zero,
    e a variavel operacao importa muito sim, ao contrario do que o colega falou,e so fazer uma simulacao que vc ve o erro.

    cuidado que a serie cresce muito rapido entao estoura muito rapido o limite das variaveis por isso usei double.



  1. Relacionados





Novo tópico   Responder tópico     Índice do forum -> Java Básico