Pergunta

Estou a desenvolver uma matemática analisador que é capaz de avaliar a Cadeia de caracteres como '5+b*sqrt(c^2)'.Eu estou usando o ANTLR para a análise e a fazer bons progressos.Agora eu caí sobre a classe Java BigDecimal e pensei:ei, por que não pensar sobre a precisão aqui.

O meu problema é que a API Java não fornece métodos para trigonométricas BigDecimals como java.lang.Math.Você sabe se existem bons bibliotecas de matemática, como o Apache Commons para fora lá que lidar com este problema?

A outra questão é: como realizar o método de alimentação para que eu possa calcular 4.9 ^ 1.4 com BigDecimals.Isso é possível?

Um pedido de livro sobre computação numérica também é apreciado.

Foi útil?

Solução

Apfloat é uma biblioteca que contém aproximações de precisão arbitrária de funções tripométricas e poderes não inteiros; No entanto, ele usa suas próprias representações internas, em vez de BigDecimal e BigInteger. Eu não usei antes, então não posso garantir suas características de correção ou desempenho, mas a API parece bastante completa.

Outras dicas

BigDecimal não fornecer estes métodos, porque BigDecimal modelos de um número racional.Funções trigonométricas, raiz quadrada e poderes para não-inteiros (o que eu acho que inclui as raízes quadradas) todos gerar números irracionais.

Estes podem ser aproximados com um arbitrário-número de precisão, mas o valor exato não pode ser armazenado em um BigDecimal.Ele não é realmente o que eles são.Se você está com a aproximação de algo, de qualquer maneira, você pode muito bem usar apenas um double.

A Biblioteca Big-Math fornece todas as funções matemáticas avançadas padrão (POW, SQRT, Log, Sin, ...) para BigDecimal.

https://github.com/eobermuhlner/big-math

Eu normalmente use o "cheque / ordem de pagamento" neste cenário - você pode alterar o nome do frontend para ser o que preferir.Você pode sempre chicotear algo para esconder a opção e ter sempre selecionado.

Praticamente o melhor livro sobre computação numérica seria Receitas numéricas

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top