Biblioteca Math

8 respostas
F

To com problemas com a biblioteca Math.

Se o valor da variavel a for maior que 4, o resultado não é o correto.

double a = 4;		
double x = Math.pow(a, 23)%187;
System.out.println(x); //x=64

o valor de x será 64 e rodando o codigo a seguir, o valor retornará a ser a

double y = Math.pow(x, 7)%187;
System.out.println(y); // y=4;

se colocar a=5 e software não consegue voltar o resultado correto.

Alguem tem alguma solução?

8 Respostas

V

Que resultados você esperava?

V

Provavelmente o que ocorre é que x^23 para x=5 é um número tão grande, mas tão grande, que o resultado acaba em notação científica, e aproximado.

Para resolver, tente usar a classe BigDecimal, que tem precisão arbitrária.

T
double a = 4;		
double x = Math.pow(a, 23)%187;
System.out.println(x); //x=64

Complementando o que disse o Vinigodoy:

5 elevado a 23 é 11920928955078125 (como você deve saber usando a calculadora do Windows), mas como você deve saber, esse valor requer 54 bits de precisão para ser expresso exatamente (log na base 2 de 5 ^23 vale 53,40…). O problema é que o double tem apenas 52 bits de precisão, já que o resto dos 64 bits é usado para expoente (11 bits) e sinal. http://steve.hollasch.net/cgindex/coding/ieeefloat.html

Para fazer esse cálculo (exponenciação e resto), use a classe BigInteger, que já tem isso pronto em um único método ( modPow. )

F

Thingol,

valeu pela ajuda.

Mas tem um probleminha, não to conseguindo atribuir um valor do tipo inteiro para a variavel BigInteger?

Obrigado.

V

BigInteger a = new BigInteger("5"); BigInteger x = a.modPow(23, new BigInteger("187"));

Para essas coisas, existe o JavaDoc:
http://java.sun.com/j2se/1.4.2/docs/api/java/math/BigInteger.html

F

Valeu cara… essa parte eu resolvi… preciso dessa agora…

for (int i = 0; i < str.length(); i++) {
			for (int j = 1; j <= vetChar.length; j++) {
				if (str.charAt(i) == vetChar[j]) {
					vetInt[i] = j ;
				}
			}

o vetInt[i] (BigInteger) precisa receber [b]j/b, como que faço isso ?

Obrigado.

T

O Vinigodoy já lhe deu a resposta para a conversão String -> BigInteger, acho que você deve saber como se faz int -> String. Como ele lhe disse, para que serve o Javadoc?

A

for (int i = 0; i < str.length(); i++) { for (int j = 1; j <= vetChar.length; j++) { if (str.charAt(i) == vetChar[j]) { vetInt[i] = Integer.parseInt(j) ; // passa uma string para int } }

para passar um int para String

int xpto=57,
String xptzebra=Integer.toString(xpto);
Criado 29 de abril de 2008
Ultima resposta 30 de abr. de 2008
Respostas 8
Participantes 4