La mejor biblioteca matemática de precisión arbitraria multiplataforma (portátil) [cerrada]
Estoy buscando una buena biblioteca matemática de precisión arbitraria en C o C ++. ¿Podría por favor darme algunos consejos / sugerencias?
Los requisitos principales:
EsoDEBE manejar arbitrariamente enteros grandes (mi interés principal está en los enteros). En caso de que no sepa lo que significa la palabra arbitrariamente grande, ¡imagine algo como 100000! (El factorial de 100000).La precisiónNO DEBE NECESITAR a especificar durante la inicialización de la biblioteca / creación de objetos. La precisión debeSOLAMENTE estar limitado por los recursos disponibles del sistema.EsoDEBERÍA utilizar toda la potencia de la plataforma y debe manejar números "pequeños" de forma nativa. Eso significa que en una plataforma de 64 bits, calcular 2 ^ 33 + 2 ^ 32 debería usar las instrucciones de CPU de 64 bits disponibles. La bibliotecaNO DEBERÍA calcule esto de la misma manera que lo hace con 2 ^ 66 + 2 ^ 65 en la misma plataforma.EsoDEBE manejar suma (+), resta (-), multiplicación (*), división entera (/), resto (%), potencia (**), incremento (++), decremento (-), mcd (), factorial (), y otros cálculos aritméticos enteros comunes de manera eficiente. La capacidad de manejar funciones como sqrt () (raíz cuadrada), log () (logaritmo) que no producen resultados enteros es una ventaja. Habilidad para manejarcálculos simbólicos es aún mejorEsto es lo que encontré hasta ahora:
Java'sBigInteger yBigDecimal clase: he estado usando estos hasta ahora. He leído el código fuente, pero no entiendo las matemáticas debajo. Puede estar basado en teorías / algoritmos que nunca he aprendido.El tipo entero incorporado o en las bibliotecas principales deantes de Cristo / Pitón / Rubí / Haskell / Ceceo / Erlang / OCaml / PHP / algunos otros idiomas: alguna vez he usado algunos de estos, pero no tengo idea de qué biblioteca están usando, o qué tipo de implementación están usando.Lo que ya he sabido:
Usando uncarbonizarse como un dígito decimal, y uncarbonizarse* como una cadena decimal y hacer cálculos sobre los dígitos usando un bucle for.Usando unEn t (o unint largoo unlargo largo) como una "unidad" básica y una matriz de la misma como un entero largo arbitrario, y hacer cálculos sobre los elementos utilizando un bucle for.Usar un tipo entero para almacenar un dígito decimal (o unos pocos dígitos) comoBCD (decimal codificado en binario).Algoritmo de multiplicación de la cabinaLo que no se:
Imprimir la matriz binaria mencionada anteriormente en decimal sin usar métodos ingenuos. Ejemplo de un método ingenuo: (1) agregue los bits de menor a mayor: 1, 2, 4, 8, 16, 32, ... (2) use uncarbonizarse* cadena mencionada anteriormente para almacenar los resultados decimales intermedios).Lo que aprecio:
Buenas comparaciones enGMP, MPFR, decNumber (u otras bibliotecas que sean buenas en su opinión).Buenas sugerencias sobre libros / artículos que debería leer. Por ejemplo, una ilustración con figuras sobre cómo unpoco ingenuo El algoritmo de conversión de binario a decimal funciona es bueno. El artículo"Conversión binaria a decimal en precisión limitada" por Douglas W. Jones es un ejemplo de un buen artículo.Alguna ayuda.Por favorNO HAGA responde esta pregunta si:
piensas usar undoble (o undoble largoo unlargo largo doble) puede resolver este problema fácilmente. Si lo crees, significa que no entiendes el tema en discusión.