Problema com calculo de cosseno

13 respostas
C

Galera, fiz o codigo para calculo do cosseno. porem depois de varias iterações começa a repetir o mesmo resultado, como se nao calculasse.

Tipo assim:

" 0.9912026859711391 0.9912026859021883 0.9912026859078171 0.9912026859073779 0.9912026859074107 0.9912026859074083 0.9912026859074085 0.9912026859074085 0.9912026859074085 0.9912026859074085 0.9912026859074085 0.9912026859074085 0.9912026859074085 " Segue codigo abaixo:
public class Calc {

	//numero de repetições
	int num = 100;

	
	public double cosseno(double x) {
		double cos = 1;
		int soma = -1;
		int cont = 1;
		int expo = 0;


		
		while (cont <= num) {
			expo += 2;
			// calc. fatorial
			double f = 1;
			for (int n = 1; n <= expo; n++) {
				f *= n;
			}

			// calc exponencial
			double exp = 1;
			for (int i = 1; i <= expo; i++) {
				exp = exp * x;
			}

			cos += soma * (exp / f);
			soma *= -1;

			cont++;
			System.out.println(cos);

		}
		

		return cos;

	}
}
public class Cosseno {

	public static void main(String[] args) {
		
		Calc calc = new Calc();
				
		double coss = calc.cosseno(25);
		System.out.println("O Cosseno é: "+coss);
		 
	}
}

Muito obrigado a quem puder ajudar.

13 Respostas

Marcio_Lima

O resultado 0.9912026859074107
contém 16 dígitos após a vírgula

e, é fruto da divisão de 4.078315292499077E128 (valor de exp)
por 1.24384140546413E142 (valor de f)
ou seja, valores com mais de 120 dígitos antes da vírgula

nos cálculos seguintes, os valores ultrapassam 130 dígitos antes da vírgula
e o resultado 0.9912026859074085
tem variações, mas sómente em posições muito além das 16 após a vírgula
e, como deve truncar após a 16a., acaba repetindo o mesmo valor.

Inclua os demais campos no println para verificar essa informação.

C

Marcio, obrigado, entendi que o resultado varia em posições alem do que é possivel mostrar.

Me tira uma duvida,
usando a função Math.cos(30). ele apresenta o resultado

0.[telefone removido]…

ja usando o comando atual ele da uma diferença
0.1543…

Teria alguma maneira de o resultado dar igual ao do Math.cos ?

No codigo mostrado consigo o valor igual até o cosseno de 29, apartir de 30 ja nao fica mais igual

obg.

ViniGodoy

Você forneceu o angulo em radianos para o Math.cos?

E

O cosseno de 30 radianos é 0,15425144988758405071866214661421…

Entretanto, não se deve calcular o cosseno de 30 radianos, usando-se essa série de Taylor, com o valor 30. Esse valor é muito grande e vai dar erros na hora de fazer as contas.

Deve-se pegar o valor 30 e passá-lo para o intervalo entre 0 e pi.

Neste caso, cos (30 radianos) = - cos (30 - 9 pi) = - cos ( 1,7256661176918608538362095504845 ) = 0,15425144988758405071866214661421

C

entagle.
obrigado

Mas como ficaria no codigo essa alteração?
tentei aqui mas nao consegui traduzir.

grato

vinigodoy. sim em radianos
tanto que se testar o coss de 20. o resultado da igual nos dois metodos

grato

C

Galera, consegui resolver até cos de 50 com precisão de 7 casas depois da virgula.

usando o metodo de cos-(9*pi).

porém quando tento cosseno de 60, 90.
a precisão nao chega a duas casas apos a virgula

gostaria de uma formula que me desse pelo menos 6 casas de precisão.

Se alguem puder ajudar.
fico muito grato

E

Tio, que tal desenhar uma curva de cosseno e ver como é possível você fazer a tal redução para o primeiro quadrante (que é a técnica indicada para você poder ter a precisão desejada)?

Acho que se você desenhar uma curva de coseno, vai descobrir sozinho como é que se faz a redução.

Basta ver que cos (x) = cos (x + 2pi) = cos (x + 4pi) = cos (x + 6pi) = cox (x + 8pi) … e assim por diante.

Também: cos (x) = -cos(x + 3pi) = -cos(x+5pi) = -cos (x+7pi) = -cos(x+9pi) =…

Ou seja, de alguma forma (talvez fazendo uma divisão por pi, e achar o valor inteiro do resultado dessa divisão, é só uma sugestão) você determine quantos pi está o número 60. Lembra-se que eu achei o número 9 na hora de calcular o cosseno de 60 radianos? Então…

C

Obrigado amigo, enfim consegui resolver.

Porém alem disso tudo tem que fazer os calculos dos quadrantes para que o sinal não fique trocado.

pczardini

fiquei curioso agora, responde ai que foi que voce modificou?

C
//Converter radianos em graus
double radtograus = x * 57;
//Redução de quadrante
		double quadrante = radtograus/360;
//Transformar resultado em inteiro
		int quad = (int) quadrante;
//Esse codigo vai fazer a redução para que o grau esteja entre 0 e 360º, sabendo assim em qual quadrante ele esta
		double quadrante2 = radtograus - (360 *quad);
//Verifica em qual quadrante o grau esta, sendo que no cosseno, o primeiro e o ultimo quadrante é positivo.
//Primeiro verificamos se esta no primeiro quadrande (0 a 90 graus)
		if(((quadrante2 >0) && (quadrante2 <=90)) &&(cos<0) ) {
			cos = cos*-1;
		} 
//Depois verificamos se o grau esta no quadro quadrante (270 graus acima) lembrando que nao precisa colocar <=360 pois a redução ja o deixa sempre menor que isso
			if ((quadrante2 >=270) && (cos<0)) {
			cos = cos*-1;
		}
//Caso nao esteja no primeiro nem no quarto quadrante, concerteza estará no segundo ou terceiro
//Sendo que s e a resposta tiver sinal positivo obrigatoriamente sera mudado para negativo, deixando a reposta correta
			else if (cos>0){
			cos = cos*-1; 
		}

Valeu!

B

pqp, um radiano é exatamente igual a 57 graus? De onde você achou esse número redondo?

B

Poderia usar http://download.oracle.com/javase/6/docs/api/java/lang/Math.html#toRadians(double) e http://download.oracle.com/javase/6/docs/api/java/lang/Math.html#toDegrees(double) . Queria saber onde no meio do lixo você achou o valor 57.

C

bezier,

um radiano é aproximadamente 57 graus.

porendo usando só o 57 consegui um cosseno bem preciso

Criado 23 de outubro de 2010
Ultima resposta 27 de out. de 2010
Respostas 13
Participantes 6