Desempenho em Java e números grandes

12 respostas
Asaba

Boa noite caros colegas

Esse é meu primeiro tópico nesse forum e já vou começar com várias duvidas

Bem…como podem perceber sou iniciante em java e como é comum nessa fase a cada projeto que faço me deparo com varias duvidas. Alguns problemas são solucionados após longa pesquisa e outros nem assim

Estou fazendo um programa para fazer um trabalho de probabilidade e estatística na faculdade e me deparei com algum problemas

Nesse trabalho sou obrigado a realizar varias contas com uma grande quantidade de números (200000 números diferentes) e algumas dessas contas tem um expoente 100000.

Consegui resolver o problema dos grandes números após encontrar a classe BigDecimal porém quando chega a hora de fazer os valores (que já são monstruosos) elevados a 100000 a uma demora incrivelmente alta até que ocorre o fatídico estouro de memória. Tentei aumentar a memória do Java sem sucesso, porém acho que estou fazendo errado. Portanto vamos as duvidas

O lugar exato para configurar a memória disponível para a JVM?

As limitações de memória existentes em sistemas 32bits afetam diretamente o java (tenho 2Gb de memória)?

O java e o Eclipse apresentam melhor desempenho em ambientes 64bits?

A alguma outra classe no java para se manipular algoritmos grandes com necessidade de alta precisão? (O BigDecimal está dando erro em divisões com muitas casas após a virgula)

Desde já agradeço, e peço desculpa pelo típico grande

12 Respostas

Luca

Olá

Use doubles.

Normalmente em qualquer cálculo matemático feito por computador independentemente da linguagem usada, estão implicitos alguns tipos de erro. Há vários textos sobre Teoria dos Erros explicando como lidar com isto:
http://euclides.if.usp.br/~ewout/ensino/fge2255/textos/ConcBasTeorErr.pdf

http://www.cmpa.tche.br/educacional/secoes_ensino/site_sec_C/arquivos%20e%20Links/F�sica/Textos_diversos_8.pdf

Tudo o que você precisa é saber avaliar os erros e até onde isto influi no seu trabalho.

Usar computadores e linguagens para 64 bits não melhoram em nada a precisão dos seus cálculos. Em Fortran e usando opções especiais e compilação em C, se pode forçar cálculos intermediários usando os registradores de 80 bits internos ao coprocessador aritmético mas os dados ao serem copiados de volta para a memória são truncados para 64 bits. Esta seria a única melhoria possível.

[]s
Luca

Asaba

Obrigado pela resposta…irei dar uma boa olhada nesse material

priscila.vriesman

Se for fazer grandes cálculos é melhor usar BigDecimal!
Pois se chegar no limite do tamanho do double (64) ou float (32), o valor
é truncado e arredondado!

E aí os números acabam sendo aproximados, e não exatos.

:-o

Priscila Vriesman

Luca

Olá

priscila.vriesman:
Se for fazer grandes cálculos é melhor usar BigDecimal!
Pois se chegar no limite do tamanho do double (64) ou float (32), o valor
é truncado e arredondado!

E aí os números acabam sendo aproximados, e não exatos.

Não sei se você tem formação matemática ou se é engenheira como eu ou ainda se tem a mesma experiência que eu em fazer cálculos matemáticos com grandes volumes de dados, mas mesmo assim vou tomar a liberdade de discordar.

Como expliquei no post anterior, cálculos matemáticos não são obrigatoriamente exatos. Sempre há que se considerar a presença de erros e lidar com a tolerância deles. Há muitos recursos dentro da matemática para se fazer cálculos com a maior precisão possível. Trabalho com sistemas em Fortran que resolvem sistemas não lineares de equações com milhares de incógnitas, onde necessito de muita precisão e há meios de controlar perfeitamente os erros ou minimizá-los.

A classe BigDecimal não foi feita para cálculos matemáticos e sim para as continhas simples monetárias comuns em contabilidade e assemelhados do modo como se faz em COBOL com tipos decimais. Como gambiarra pode ser usada em alguns casos de poucos dados para contas mais complexas mas no caso dele com grande volume de dados isto é inviável.

[]s
Luca

Ironlynx

Noop… como o luca falou, não dá para ter “exatidão”, mesmo com BigDecimal.Não tem(em Java) como vc explorar os limites da máquina, o que há é uma margem de erro que normalmente não é atingida.
Uma máquina não sabe nem fazer contas de subtração, ela soma um número(dito positivo) com outro número(dito negativo) pq em geral, o primeiro digito(o primeiro bit do número), serve como marcador para o número(dizendo se é negativo ou não).Ou seja, vc soma um número com o segndo operador negado, e o que passar do limite, volta para o resultado.

Asaba, vc tem necessidade de cálculos tãaao precisos assim?Sem um co-processador, achoo que esses números elevados a potências tão grandes, vão estourar qualquer computador, se bobear, vai precisar daqueles registradores especiaisde 128bits, que a Hitachi(se não me engano) tem.

Asaba

[quote=Ironlynx]


Asaba, vc tem necessidade de cálculos tãaao precisos assim?Sem um co-processador, achoo que esses números elevados a potências tão grandes, vão estourar qualquer computador, se bobear, vai precisar daqueles registradores especiaisde 128bits, que a Hitachi(se não me engano) tem.

Não não…não tenho necessidade de números tão precisos porém os números crescem extremamente na potenciação pois em alguns cálculos trata-se da somatoria de 100000 números distintos elevados a 100000.

Mas sem problema galera…já estava ciente que java não é uma linguagem para cálculos complexos e coisas do tipo.

Mas aproveitando a boa vontade dos colegas…o Eclipse e o JVM de forma geral apresentam melhor desempenho em ambientes 64bits (linux ou windows) ou o desempenho é o mesmo dos ambientes 32bits?

Quanto ao problema numérico vou pesquisar outras formas já que o trabalho é originalmente proposto para ser feito no excel então deve ter algo errado na formula anotada

Brigadão galera que respondeu ao topico

Luca

Olá

Como eu disse, não é problema do Java. Nos cálculos matemáticos o que é importa é o número de algaritmos significativos e este número é igual para doubles em Java, C, Fortran, usando Excel ou Mathematica, etc.

Deveria apresentar melhor desempenho usando as versões 64 bits em máquinas 64 bits. Porém já andei lendo sobre a decepção dos que experimentaram fazer isto. O resultado não é muito melhor e ainda houve casos de aparecerem erros em algumas aplicações que em 32 bits funcionam OK.

[]s
Luca

louds

Use BigInteger e não BigDecimal, a diferença de performance é abismal.

Além disso, atente ao fato que apm em java é muito lendo pois todos objetos são imutaveis. Considere utilizar uma biblioteca especializada em C ou fortran.

Luca

Olá

Na primeira mensagem ele disse que tem problemas com as divisões com muitas casas após a virgula portanto BigInteger não é adequado.

Esta observação seria só para o caso de usar classes para representar os números, certo?

A sugestão de procurar bibliotecas como a Mathematica que citei antes ou a IMSL que vem com alguns Fortrans, pode ser interessante caso o problema seja não saber implementar o algoritmo matemático.

[]s
Luca

Asaba

Vocês podem falar mais sobre a Biblioteca Mathematica ???

Pelo que vi ela serve para calculos mais complexos como Integrais, Diferenciais e Derivadas, além de fazer gráficos em 2 e 3D. Alguém tem experiência com esse programa?

Grato e bom dia a todos

priscila.vriesman

Luca:
Olá

priscila.vriesman:
Se for fazer grandes cálculos é melhor usar BigDecimal!
Pois se chegar no limite do tamanho do double (64) ou float (32), o valor
é truncado e arredondado!

E aí os números acabam sendo aproximados, e não exatos.

Não sei se você tem formação matemática ou se é engenheira como eu ou ainda se tem a mesma experiência que eu em fazer cálculos matemáticos com grandes volumes de dados, mas mesmo assim vou tomar a liberdade de discordar.

Como expliquei no post anterior, cálculos matemáticos não são obrigatoriamente exatos. Sempre há que se considerar a presença de erros e lidar com a tolerância deles. Há muitos recursos dentro da matemática para se fazer cálculos com a maior precisão possível. Trabalho com sistemas em Fortran que resolvem sistemas não lineares de equações com milhares de incógnitas, onde necessito de muita precisão e há meios de controlar perfeitamente os erros ou minimizá-los.

A classe BigDecimal não foi feita para cálculos matemáticos e sim para as continhas simples monetárias comuns em contabilidade e assemelhados do modo como se faz em COBOL com tipos decimais. Como gambiarra pode ser usada em alguns casos de poucos dados para contas mais complexas mas no caso dele com grande volume de dados isto é inviável.

[]s
Luca

Então Luca…já trabalhei com grandes quantidades de cálculo, faço sempre assim: uso double, caso há possibilidade do double estourar, uso BigDecimal ou alguma biblioteca matemática…

Luca

Olá

Só para esclarecer a todos: a possibilidade do double estourar seria o caso do cálculo exigir mais algaritmos significativos do que o double pode armazenar.

Sou engenheiro estrutural e os engenheiros estruturais são popularmente conhecidos como calculistas. Meu carro chefe na engenharia estrutural é o cálculo de estruturas suportadas por cabos que na prática são problemas altamente não lineares em que os sistemas são resolvidos diversas vezes e precisam convergir dentro de certa tolerância bem pequena. Na área de solução de sistemas de equações, às vezes os sistemas são mal condicionados e se necessita de muita precisão para compensar este mal condicionamento.

Já fui por muitos anos especialista na resolução de grandes sistemas de equações. Até hoje nunca vi um caso em que o número de algaritmos significativos dos doubles precisasse de algo parecido com BigDecimal. Mas repito, sou engenheiro e engenheiros não fazem cálculos exatos. Tanto isto é verdade que na engenharia se aplicam muitos métodos aproximados como por exemplo o método dos elementos finitos.

Mas há algumas raríssimas áreas do conhecimento em que são necessários cálculos exatos e antes de qualquer conta feita é preciso uma avaliação adequada dos erros envolvidos. Já pensaram como deve ser crítico o cálculo da trajetória de uma nave para ir a Jupiter?

[]s
Luca

Criado 4 de novembro de 2007
Ultima resposta 7 de nov. de 2007
Respostas 12
Participantes 5