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:
-
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).
-
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.
-
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.
-
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:
-
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.
-
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:
-
Utilizando
char
para los dígitos decimales ychar*
para cadenas decimales, y hacer cálculos sobre los dígitos utilizando unfor
- y el bucle. -
Utilizando
int
(olong int
olong long
) como "unidad" básica y un Array de ese tipo como un entero largo arbitrario, y hacer cálculos sobre los elementos utilizando unfor
- y el bucle. -
Utilizar un tipo entero para almacenar un dígito decimal (o unos cuantos dígitos) como BCD (Binary-coded decimal) .
Lo que no sé:
- 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:
-
Buenas comparaciones sobre GMP , MPFR , decNúmero (u otras bibliotecas que sean buenas en su opinión).
-
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.
-
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.