[Programacão~Linguagens] - Fatorial

4 respostas
ArchV

Olá Pessoal, antes de mais nada procurei na web e não encontrei fontes confiáveis sobre o assunto.

A questão é, como é possível computar um fatorial muito grande, por exemplo 500!? Como iria ocorrer a fragmentação para realizar este cálculo?

Atenciosamente,
ArchV.

4 Respostas

B

Para calcular um número muito grande, basta um lugar grande para guardá-lo 8)

Neste caso você precisa de um tipo de dados com precisão infinita, no Java BigInteger e o BigDecimal devem dar conta do recado.

Se quiser fazer em termos de array de bytes/int/long, aí tens que fazer a tua própria lógica para guardar e calcular.

ArchV

Bruno Laturner:
Para calcular um número muito grande, basta um lugar grande para guardá-lo 8)

Neste caso você precisa de um tipo de dados com precisão infinita, no Java BigInteger e o BigDecimal devem dar conta do recado.

Se quiser fazer em termos de array de bytes/int/long, aí tens que fazer a tua própria lógica para guardar e calcular.

certo. Justamente aqui que queria saber qual tipo de tratamento é possivel? em termos de array de int/long

B

Bem, isso foi e é assunto para milhares de livros, seminários, papéis da área da computação, e algumas dezenas de bibliotecas de aritmética de precisão arbitrária.

O básico de tudo é o seguinte: byte, int e long são tipos de dados para números com sinal, eles podem guardar até 8, 32 e 64 bits neles, onde no caso do long, vai de -1* (2^63 -1) até 2^63.

Como não dá para colocar 64 bits dentro de um registro de uma máquina 32 bit, o Java usa 2 registros de 32 para simular um de 64, e assim quando um número ultrapassa o valor máximo do primeiro registro de 32 bits(byte de baixa ordem), o valor é transbordado (overflow) para o outro registro(byte de alta ordem).

O trabalho que vai ter é fazer a mesma coisa, se você tiver um array de int de 4 posições, você terá 4*32 bits para usar, o que dá uma precisão de 128 bits. Quando algum valor transbordar um byte de baixa ordem, você terá que colocar o que foi transbordado no byte de alta ordem imediatamente próximo à ele, isso até ter um valor que ocupe as 4 posições do array.

Se der overflow na 4ª posição, terá que criar um novo array maior que 4, copiar o conteúdo do array antigo para o novo, e colocar o overflow na 5ª posição.

ArchV

Bruno Laturner:
Bem, isso foi e é assunto para milhares de livros, seminários, papéis da área da computação, e algumas dezenas de bibliotecas de aritmética de precisão arbitrária.

O básico de tudo é o seguinte: byte, int e long são tipos de dados para números com sinal, eles podem guardar até 8, 32 e 64 bits neles, onde no caso do long, vai de -1* (2^63 -1) até 2^63.

Como não dá para colocar 64 bits dentro de um registro de uma máquina 32 bit, o Java usa 2 registros de 32 para simular um de 64, e assim quando um número ultrapassa o valor máximo do primeiro registro de 32 bits(byte de baixa ordem), o valor é transbordado (overflow) para o outro registro(byte de alta ordem).

O trabalho que vai ter é fazer a mesma coisa, se você tiver um array de int de 4 posições, você terá 4*32 bits para usar, o que dá uma precisão de 128 bits. Quando algum valor transbordar um byte de baixa ordem, você terá que colocar o que foi transbordado no byte de alta ordem imediatamente próximo à ele, isso até ter um valor que ocupe as 4 posições do array.

Se der overflow na 4ª posição, terá que criar um novo array maior que 4, copiar o conteúdo do array antigo para o novo, e colocar o overflow na 5ª posição.

Hmm, interessante. Obrigado bruno, irei pesquisar mais sobre o assunto. Entretanto, foi de grande ajuda seu post.

Criado 3 de maio de 2010
Ultima resposta 3 de mai. de 2010
Respostas 4
Participantes 2