Bom eu tenho um pequeno exercício de estátistica para fazer e para facilitar as coisas eu escrevi algumas linhas de java para me ajudar. Funcionou que foi uma maravilha, consegui economizar bastante tempo mas, foi ai que surgiu um pequeno problema que é quando faço os valores ao quadrado está retornando uns valores dos quais eu desconfio. Gostaria de saber se tem haver com os tipos que estou usando.
Segue o código:
[code]
class Somatoria{
public static void main (String [] args){
int ra = 200813364;
int soma = 0;
double somatoria;
int [] vt = new int [50];
for(int i = 1;i <= 50;i++){
vt[i-1] = (ra+i)*(ra+i);// aqui está retornando 1274730745 na primeira volta do loop
//onde os valores são 200813365*200813365 que na caluladora
//o resultado é 40326007562623225
System.out.println(vt[i-1]);
}
for(int x = 0;x<vt.length;x++){
soma += vt[x];
}
somatoria = soma/50;
somatoria = Math.pow(somatoria,2);// somatoria de x ao quadrado
System.out.println(somatoria);
}
}[/code]
Alguem pode me dizer por que a diferença entre os resultados.
Um int suporta números de -2147483648 até +2147483647. Como o resultado esperado é 40326007562623225, que passa de um int, então ele dá esse resultado errado ( 1274730745 ) em vez de 40326007562623225.
Se você tiver curiosidade por que é que deu 1274730745, experimente converter 40326007562623225 para hexadecimal. Vai dar o número 8F444A4BFAD8F9. Se você pegar apenas os últimos 8 dígitos (32 bits, que é o que cabe em um int), vai dar o valor 4BFAD8F9. Convertendo esse valor para decimal de novo, vai dar 1274730745, que é o tal número errado que deu nas suas contas.
Se quiser fazer contas com números MUITO grandes, use um BigDecimal ou BigInteger.
Como você está trabalhando com estatística, basta usar double, que é suficiente para 99,95% das coisas que você vai precisar fazer.
Tem a ver sim com o tipo de dados q vc está usando…
trocando pra long deve funcionar como vc quer
Long ra = new Long(200813364);
Long soma = new Long(0);
double somatoria;
Long [] vt = new Long [50];
for(int i = 1;i <= 50;i++){
vt[i-1] = (ra+i)*(ra+i);// aqui está retornando 1274730745 na primeira volta do loop
//onde os valores são 200813365*200813365 que na caluladora
//o resultado é 40326007562623225
System.out.println(vt[i-1]);
}
for(int x = 0;x<vt.length;x++){
soma += vt[x];
}
somatoria = soma/50;
somatoria = Math.pow(somatoria,2);// somatoria de x ao quadrado
System.out.println(somatoria);
}