A melhor biblioteca matemática de precisão arbitrária para várias plataformas (portátil) [fechada]
Estou procurando uma boa biblioteca matemática de precisão arbitrária em C ou C ++. Poderia me dar alguns conselhos / sugestões?
Os principais requisitos:
istoDEVO lidar com números inteiros arbitrariamente grandes (meu principal interesse é por números inteiros). Caso você não saiba o que a palavra arbitrariamente grande significa, imagine algo como 100000! (o fatorial de 100000).A precisãoNÃO DEVE NECESSIDADE a ser especificado durante a inicialização da biblioteca / criação de objeto. A precisão deveSÓ ser restringido pelos recursos disponíveis do sistema.istoDEVEMOS utilize todo o poder da plataforma e deve lidar com números "pequenos" nativamente. Isso significa que em uma plataforma de 64 bits, o cálculo de 2 ^ 33 + 2 ^ 32 deve usar as instruções disponíveis da CPU de 64 bits. A bibliotecaNÃO DEVERIA calcule isso da mesma maneira que com 2 ^ 66 + 2 ^ 65 na mesma plataforma.istoDEVO manipular adição (+), subtração (-), multiplicação (*), divisão inteira (/), restante (%), potência (**), incremento (++), decremento (-), decremento (-), gcd (), fatorial () e outros cálculos aritméticos inteiros comuns com eficiência. A capacidade de lidar com funções como sqrt () (raiz quadrada), log () (logaritmo) que não produzem resultados inteiros é uma vantagem. Capacidade de lidarcálculos simbólicos é ainda melhor.Aqui está o que eu encontrei até agora:
JavaéBigInteger eBigDecimal classe: Eu tenho usado isso até agora. Eu li o código fonte, mas não entendo a matemática por baixo. Pode ser baseado em teorias / algoritmos que eu nunca aprendi.O tipo inteiro interno ou nas bibliotecas principais debc / Pitão / Rubi / Haskell / Lisp / Erlang / OCaml / PHP / alguns outros idiomas: eu já usei alguns deles, mas não tenho idéia de qual biblioteca eles estão usando ou que tipo de implementação eles estão usando.O que eu já sabia:
Usando umCaracteres como um dígito decimal e umCaracteres* como uma sequência decimal e faça cálculos nos dígitos usando um loop for.Usando umint (ou umlong intou umlongo longo) como uma "unidade" básica e uma matriz como um número inteiro longo arbitrário e faça cálculos nos elementos usando um loop for.Usando um tipo inteiro para armazenar um dígito decimal (ou alguns dígitos) comoBCD (decimal com código binário).Algoritmo de multiplicação de BoothO que eu não sei:
Imprimir a matriz binária mencionada acima em decimal sem usar métodos ingênuos. Exemplo de método ingênuo: (1) adicione os bits do mais baixo ao mais alto: 1, 2, 4, 8, 16, 32, ... (2) use umCaracteres* string mencionada acima para armazenar os resultados decimais intermediários).O que eu aprecio:
Boas comparações emGMP, MPFR, decNumber (ou outras bibliotecas que são boas na sua opinião).Boas sugestões de livros / artigos que eu deveria ler. Por exemplo, uma ilustração com figuras sobre como umingênuo o algoritmo de conversão binário para decimal funciona é bom. O artigo"Conversão binária em decimal em precisão limitada" por Douglas W. Jones é um exemplo de um bom artigo.Qualquer ajuda.Por favorNÃO responda a esta pergunta se:
você acha que usando umDuplo (ou umlongo duploou umlongo longo duplo) pode resolver esse problema facilmente. Se você pensa assim, significa que não entende o assunto em discussão.