Problema com calculo de cosseno

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:

[code]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;

}

}
[/code]

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.

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.

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.15425144988…

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.

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

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

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

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

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…

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.

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


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

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

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.

bezier,

um radiano é aproximadamente 57 graus.

porendo usando só o 57 consegui um cosseno bem preciso