BigInteger/BigDecimal tem tamanho infinito? Arredonda números altos?

9 respostas
A

Pessoal, se eu fizer a conta em BigDecimal (exemplo):
999 quinquilhões * 998 quinquilhões * 700 quinquilões, vai dar o número real (sem arredondamento e do tamanho que deve ser) ou vai dar arredondado?

Outra pergunta
Se eu pedir para o BigDecimal calcular o PI (355/113), qual é o máximo de caracteres que ele calcula? (desculpe por não testar, estou num PC bem velho, com 256MB de RAM :D)

Vlw galera

9 Respostas

A

Bom, pegue o teste então, bem auto-explicativo: :wink:

public static void main(String[] args) {

        String num1 = "999000000000000000000000000";
        String num2 = "999000000000000000000000000";
        String num3 = "999000000000000000000000000";
        String num4 = "999000000000000000000000000";

        BigInteger bi1 = new BigInteger(num1);
        BigInteger bi2 = new BigInteger(num2);
        BigInteger bi3 = new BigInteger(num3);
        BigInteger bi4 = new BigInteger(num4);

        BigInteger result1 = bi1.multiply(bi2).multiply(bi3).multiply(bi4);
        System.out.println(result1);

        String num5 = "355";
        String num6 = "113";
        BigDecimal bd1 = new BigDecimal(num5);
        BigDecimal bd2 = new BigDecimal(num6);
        BigDecimal result2 = bd1.divide(bd2);

        System.out.println(result2);
}

// console:
996005996001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
Exception in thread "main" java.lang.ArithmeticException: Non-terminating decimal expansion; no exact representable decimal result.
	at java.math.BigDecimal.divide(BigDecimal.java:1514)
	at Teste.main(Teste.java:79)
V

Se eu não me engano o tamanho do BigInteger não pode exceder um número com 2.147.483.648 de casas decimais.

A

BigDecimal vocês quis dizer?

C

O BigInteger guarda o seu valor num array de int, e como os vetores em Java não passando do valor Integer.MAX_VALUE, então podemos concluir que o maior número possível de ser guardado num BigInteger é um número com um pouco mais de 4 bilhões de casas.
E como o BigDecimal é uma representação que guarda a posição da casa decimal em um BigInteger(ou seja, ele tem um BigInteger pra guardar o seu valor), ele também vai guardar no máximo o tamanho de um vetor.

M

Se é até Integer.MAX_VALUE (na verdade um a mais pois Java é zero-indexed) então tem, no máximo 2.147.483.648 (pouco mais de 2 bilhões e 147 milhões de casas, como disse o ViniGodoy) e não mais de 4 bilhões.

E

De qualquer maneira, a aproximação que você propôs para pi ( 355/113 ) é uma dízima periódica com período 112.

3.1415929203539823008849557522123893805309734513274336283185840707964601769911504424778761061946902654867256637168
  1415929203539823008849557522123893805309734513274336283185840707964601769911504424778761061946902654867256637168
  1415929203539823008849557522123893805309734513274336283185840707964601769911504424778761061946902654867256637168...
A

entanglement:
De qualquer maneira, a aproximação que você propôs para pi ( 355/113 ) é uma dízima periódica com período 112.

3.1415929203539823008849557522123893805309734513274336283185840707964601769911504424778761061946902654867256637168
  1415929203539823008849557522123893805309734513274336283185840707964601769911504424778761061946902654867256637168
  1415929203539823008849557522123893805309734513274336283185840707964601769911504424778761061946902654867256637168...

Nem se estressa com esse negócio do PI, não quero calcula ele não, foi só a primeira fração com resultado grande que me veio a cabeça para o exemplo :smiley:
Só uma dúvida, vc está querendo dizer que o valor

1415929203539823008849557522123893805309734513274336283185840707964601769911504424778761061946902654867256637168

vai ficar se repetindo sempre? Não sabia dessa, se for isso mesmo, calcular o PI é uma coisa fácil.

Mas, obrigado pessoal, solucionaram minhas dúvidas. Como sempre, a galera aqui do GUJ dando show na explicação!

T

Amigo, PI não é um número racional.

Não há como exprimi-lo como uma fração, e isso foi provado há algumas centenas de anos por Lambert

A aproximação 355/113 é uma aproximação, encontrada pelos chineses por volta do ano 480.

http://numbers.computation.free.fr/Constants/Pi/piApprox.html

M

E atualmente, a maior aproximação que se conseguiu fazer de PI foi realizada por Fabrice Bellard (com 2699999990000 dígitos, que leveram 131 dias para serem computados).

Criado 20 de fevereiro de 2010
Ultima resposta 22 de fev. de 2010
Respostas 9
Participantes 7