54 votos

¿Cuáles son las mejores bibliotecas matemáticas de precisión arbitraria multiplataforma (portátiles)?

Estoy buscando una buena biblioteca matemática de precisión arbitraria en C o C++. ¿Podríais darme algunos consejos o sugerencias?

Los requisitos principales:

  1. Es debe manejar números enteros arbitrariamente grandes: mi interés principal está en los números enteros. ¡En caso de que no sepas lo que significa la palabra "arbitrariamente grande", imagina algo como 100000! (el factorial de 100000).

  2. La precisión no debe necesitar que debe especificarse durante la inicialización de la biblioteca o la creación del objeto. La precisión debe sólo estar limitado por los recursos disponibles del sistema.

  3. Es debe utilizar toda la potencia de la plataforma, y debería manejar números "pequeños" de forma nativa. Esto significa que en una plataforma de 64 bits, el cálculo de (2^33 + 2^32) debería utilizar las instrucciones disponibles en la CPU de 64 bits. La biblioteca no debe calcula esto de la misma manera que lo hace con (2^66 + 2^65) en la misma plataforma.

  4. Es debe manejan eficientemente la adición ( + ), la sustracción ( - ), la multiplicación ( * ), la división de enteros ( / ), resto ( % ), la potencia ( ** ), incrementar ( ++ ), disminución ( -- ), GCD, factorial y otros cálculos aritméticos de números enteros comunes. La capacidad de manejar funciones como root cuadrada y el logaritmo que no producen resultados enteros es una ventaja. La capacidad de manejar cálculos simbólicos es aún mejor.

Esto es lo que he encontrado hasta ahora:

  1. Java 's BigInteger y BigDecimal clase: Hasta ahora he estado usando esto. He leído el código fuente, pero no entiendo las matemáticas que hay debajo. Puede que se base en teorías y algoritmos que nunca he aprendido.

  2. El tipo entero incorporado o en las bibliotecas del núcleo de bc , Python , Ruby , Haskell , Lisp , Erlang , OCaml , PHP y algunos otros idiomas: He utilizado algunos de ellos, pero no tengo ni idea de qué biblioteca están utilizando, o qué tipo de implementación están utilizando.

Lo que ya sabía:

  1. Utilizando char para los dígitos decimales y char* para cadenas decimales, y hacer cálculos sobre los dígitos utilizando un for - y el bucle.

  2. Utilizando int (o long int o long long ) como "unidad" básica y un Array de ese tipo como un entero largo arbitrario, y hacer cálculos sobre los elementos utilizando un for - y el bucle.

  3. Utilizar un tipo entero para almacenar un dígito decimal (o unos cuantos dígitos) como BCD (Binary-coded decimal) .

  4. Algoritmo de multiplicación de Booth .

Lo que no sé:

  1. Imprimir el Array binario mencionado anteriormente en decimal sin utilizar métodos ingenuos. Un ejemplo de método ingenuo: (1) sumar los bits de menor a mayor: 1, 2, 4, 8, 16, 32, (2) utilizar un char* -cadena mencionada anteriormente para almacenar los resultados decimales intermedios).

Lo que aprecio:

  1. Buenas comparaciones sobre GMP , MPFR , decNúmero (u otras bibliotecas que sean buenas en su opinión).

  2. Buenas sugerencias sobre libros y artículos que debería leer. Por ejemplo, una ilustración con cifras sobre cómo un no náufrago El algoritmo de conversión de binario a decimal funciona bien. El artículo " Conversión de binario a decimal con precisión limitada " de Douglas W. Jones es un ejemplo de un buen artículo.

  3. Cualquier ayuda en general.

Por favor, no responda a esta pregunta si cree que el uso de double (o long double o long long double ) puede resolver este problema fácilmente. Si piensas así, no entiendes el tema en cuestión.

17voto

Norman Ramsey Puntos 115730

GMP es la opción más popular. Squeak Smalltalk tiene una biblioteca muy buena, pero está escrita en Smalltalk.

Has preguntado por libros o artículos relevantes. La parte complicada de los bignos es la división larga. Recomiendo el artículo de Per Brinch Hansen División de longitudes múltiples revisada: Un recorrido por el campo de minas .

9voto

casevh Puntos 4596

En general, la biblioteca de precisión arbitraria de propósito general más rápida es GMP . Si quieres trabajar con valores de punto flotante, mira el MPFR biblioteca. MPFR se basa en GMP.

En cuanto al soporte nativo de precisión arbitraria en otros lenguajes, Python utiliza su propia implementación por razones de licencia, tamaño del código y portabilidad del mismo. El sitio web GMPY permite a Python acceder a la biblioteca GMP.

6voto

Richard Barrell Puntos 1952

No he comparado las bibliotecas de aritmética de precisión arbitraria entre sí, pero la gente que lo hace parece haberse decantado más o menos uniformemente por GMP. Por si sirve de algo, los enteros de precisión arbitraria en GHC Haskell y GNU Guile Scheme están implementados con GMP, y la implementación más rápida del referencia de pidigits en el tiroteo de idiomas se basa en GMP.

6voto

Ver TTMath , una pequeña biblioteca de cabeceras libres para uso personal y comercial.

3voto

fortran Puntos 26495

¿Qué pasa con Pari ? Está construido sobre GMP y proporciona todas las demás ventajas de las operaciones de teoría de números que puedas necesitar (y muchas cosas de cálculo simbólico).

Iteramos.com

Iteramos es una comunidad de desarrolladores que busca expandir el conocimiento de la programación mas allá del inglés.
Tenemos una gran cantidad de contenido, y también puedes hacer tus propias preguntas o resolver las de los demás.

Powered by:

X