Operadores Matemáticos

Pessoal tenho uma pergunta besta a fazer: :oops:

:arrow: Qual o operador matemático de potencia ?? 4² = 16
:arrow: Qual o operador matemático de raiz quadrada ?? raiz de 4 = 2

Valeu

:slight_smile:

Nao existem esses operadores em Java, mas se vc olhar na java.lang.Math, vai ver bastante coisa interessante :wink:

é que estou fazendo uma calculadora em J2ME, e lá a java.lang.Math não tem muitos recursos, então fica difícil. Eu tentei fazer potenciação: a ^ b, mas ele soma os valores das variáveis.

O jeito é deixar só com as quatro operações :frowning:

Mas valeu pela ajuda !!!
:slight_smile:

pow(double a, double b) - Returns the value of the first argument raised to the power of the second argument.

sqrt(double a) - Returns the correctly rounded positive square root of a double value.

References:
Class Math
http://java.sun.com/j2se/1.4.2/docs/api/index.html

Math não tem muita utilidade em j2me uma vez que celular com ponto fluante é muito raro.

dgouvea, a única solução é você calcular esses valores manualmente.

Potencia é simples, o método ingenuo é super simples de implementar:

int pow(int a, int b) {
  int r = 1;
  while(b-- > 0) r *= a;
    return r;
}

Raiz quadrada da um pouco mais de trabalho, você pode utilizar um método aproximativo para o cálculo direto da raiz, como newton raphson ou simpson. Não vou ter um exemplo de antemâo aqui.[/code]

Hum… poderia fazer algo do tipo:

[code]public static double raiz(int n,double c){

 if((n-c*c)<=(0.00001))
    return c;
 else
    return raiz (n ,(n/c +c)/2); 
    
                                       }[/code]

Onde n é o seu numero e c é o chute,o número q vc compara,para satisfazer a condição do número ser uma raiz…Mas nem sei se vale,já q eh J2ME…aceita double?
Nota:Esse método eh só para dar uma idéia…deve ter muitos erros,não testei… :wink:

Valeu pela ajuda pessoal, consegui colocar potenciação na calculadora.

Ironlynx, não entendi muito bem a sua lógica, o que vem a ser um chute neste caso ?

valeu mesmo !!!
:slight_smile:

Bom, esse método vai ser muito lento e provavelmente vai causar StackOverflow para números grandes.

Quase todos celulares não suportam ponto flutuante.

Estou trabalhando com variáveis int, não consegui usar a short nem a float, quando eu realizava operações matemáticas com elas causava um erro e não compilava, mesmo assim, não são todos os celulares que trabalham com decimais. Um defeito do J2ME é não ter double em sua API.

Chute eh um número qualquer q vc compara para ver se satisfaz uma dada condição…traduzindo:
raízes tendem a dar resultados inexatos(infinitos),por isso eh necessário uma comparação entre o número(a sua raiz) e um número muito próximo(o chute) a ser comparado com um parâmetro de validação(Da própria raiz) exemplo:
vc quer a raiz de n(digamos 100),vc faz(chutaremos 9 para aproximação):
n-c^2<=0.001 (onde n=100 e c=9)
se 100-81<=0.001
então aumenta o chute
se 100-12^2<0(agora c=12)
então diminuir o chute
e por aí vai…note q 0.001 é uma condição qquer para vc validar sua raiz,para obtenção de algo do tipo n-c^2=0.001 (É raiz…)é só um critério para validação…q vc deve definir,nada mais.

Nota:Desculpe minha péssima didática,mas tô estudando aqui p/umas provas da facul…(Desculpa esfarrapada…)

No CLDC 1.1 ele foi incluído (mas ainda não tem nenhum celular que o utilize, mesmo entre os novos que saíram com MIDP 2.0).

Tem como eu colocar novas APIs no celular ?? tem algum tipo diretório LIB ?? ou tudo que eu precisar na minha aplicação eu junto os JARs necessários no meu JAR ??

Usando newton-raphson para calcular raiz quadrada:

int[] sqrt(int num) {		
	int x = 1;
	int xi;
	int maxsteps = 60;
	do {
		xi = x;
		x = x + num / x   >> 1;
	}while(maxsteps-- > 0 && xi != x);

	return x;
}

PS: código não testado, adaptei de uma versão para BigInteger que escrevi.
PS2: provavel que maxsteps precise de algum tweaking.

Valeu louds funcionou !!! :slight_smile:
só uma obs o tipo do método é apenas int não um array de int. :wink:

Quando eu tentei trocar as váriaveis de int para short me aparece o seguinte erro:

possible loss of precision
found   : int
required: short
           short r = a - b;
                       ^

eu não tenho idéia do que seja isso, não é possivel realizar operações matemáticas com o short ??

Copiei errado, o original retornava o residuo também como parte do resultado.

Uma alternativa boa pra fazer raiz, é elevar o número por 1 sobre a raiz
exemplo:

Raiz quadrada de 4… 4 elevado a 1/2 (porque é quadrada)
Raiz cubica de 9… 9 elevado a 1/3
Esse 1 vem da potencia de dentro da raiz… se você tiver
raiz quadrada de 2² você faz 2 elevado a 2/2 como 2/2 é 1, fica 2 elevado a um.

Entendeu?
Ai você faz um pow com o segundo valor sendo 0,5 que é 1/2.

Calcular raiz quadrada encontrando a inversa primeiro costuma ser bastante eficiente em computadores com ponto flutuante.

Nunca tentei implementar esse método usando métodos discretos. Me parece ser mais dificil.