2011-11-16 16 views
13

¿Puede alguien decirme de una buena biblioteca de C++ para manejar (hacer operaciones, etc.) con números arbitrariamente grandes (puede ser una biblioteca que maneja flotantes de precisión arbitraria también, pero manejar enteros es más importante)?Manejar enteros de longitud arbitraria en C++

Por favor, solo consulte las bibliotecas que USTED usó y dígame cómo se las arregló para configurarlo y recogerlo, tal vez con un ejemplo muy minimalista o algo así (básicamente si la biblioteca mencionada carece de buena documentación proporciona alguna entrada de su propio).

Para el registro estoy usando Windows 7 en una máquina x64, CodeBlocks como mi IDE, y la última MinGW como el compilador.

Bibliotecas me trataron:

  • vlint (insuficiencia de las operaciones, que funciona muy bien para cosas pequeñas aunque)

  • bigint (fácil de configurarlo, errores de compilación y no mucho la documentación (de los cuales se pueden derivar errores)

  • ttmath (parecía prometedor, compiló algunos programas de ejemplo GRANDES y corrió después de algunas correcciones debido a errores de compilación, sintaxis incomprensible debido a que prácticamente no hay documentación)

  • GMP (ni siquiera podía configurarlo)

P. S. Se eliminó la 'parte disparada de la pregunta' que básicamente explicaba por qué estoy pidiendo algo que se preguntaba muchas veces sobre Stackoverflow para que la gente lo leyera hasta el final.

-> ACTUALIZACIÓN

así que cogí una respuesta que no fue una respuesta directa a mi pregunta inicial, pero me ayudó mucho a resolver esto y voy a publicar algunos de mis hallazgos para ayudar a otra C++ los novatos como yo empezamos a trabajar con números muy grandes sin tener que luchar con las bibliotecas durante días como lo hice en una fácil micro-guía paso a paso.

cosas que estaba usando (tener esto en cuenta para seguir la guía):

  • Windows 7 Ultimate x64

  • Amd k10 x64 (algunas bibliotecas no lo hará trabaje con esto, otros se comportarán de manera diferente, otros se personalizarán con AMD K10, por lo que esto no solo lo ayudará con la biblioteca que utilicé, sino también con otros)

  • Code :: Blocks 10.05 la versión sin MinGW, incluido nombre de archivo "de bloques de código-10,05-setup.exe" (instalado en C: \ Archivos de programa (x86) \ CodeBlocks)

  • paquetes MinGW (binutils-2.15.91-20040904-1.tar.gz gcc-core-3.4.2-20040916-1.tar.gz gcc-g ++ - 3.4.2-20040916-1.tar.gz mingw-runtime-3.11. tar.gz w32api-3.8.tar.gz) extraído en C: \ MinGW

  • TTMath 0.9.2 nombre de archivo "ttmath-0.9.2-src.tar.gz" descomprimido y copiado la carpeta "ttmath" a la carpeta "C: \ CPPLibs" (que es la carpeta donde puse mis bibliotecas C++)

¿Qué hacer para configurar todo

  • Ir al Código: Bloques> Configuración> compilador y depurador (se detectó Mi compilador automáticamente aquí Si esto no sucede con ustedes. , en "Compilador seleccionado", seleccione "Compilador GNU GCC" y haga clic en "Establecer como predeterminado", luego en "Ejecutables de la cadena de herramientas" en "C". el directorio de instalación de ompilers puede elegir el directorio de instalación del compilador o intentar la autodetección "y con el" compilador C++ "seleccionado o escribir" mingw32-g ++. exe ". Si esto le sucede a usted simplemente haga esto, en "Compilador seleccionado" seleccione "Compilador GNU GCC" y haga clic en "Establecer como predeterminado").

  • Sin salir de "Código: Bloques> Configuraciones> Compilador y Depurador" y con lo anterior resuelto, vaya a "Buscar directorios" y luego "Compilador" haga clic en "Agregar" y elija la carpeta donde almacena sus bibliotecas o donde coloca su carpeta "ttmath" (en mi caso C: \ CPPLibs) luego vaya a "Enlazador" y haga lo mismo.

  • Para empezar a programar con la biblioteca "ttmath" usted tiene que poner esta línea #include <ttmath/ttmath.h> antes de la función main (NOTA: Si se utiliza un sistema de 64 bits que recibirá una gran cantidad de errores si no también puso esta línea #define TTMATH_DONT_USE_WCHARANTES, esta línea #include <ttmath/ttmath.h>, estaba luchando con esta porquería hasta que encontré la solución que otro tipo que también estaba luchando encontró y publicó en la web y funcionó para mí) ps Creo que es solo para sistemas de 64 bits, pero si obtienes errores simplemente por incluir el archivo de encabezado "ttmath.h" es más probable debido a eso.

  • Declaración de variables que tendrá valores enteros se tiene que hacer de esta manera: ttmath::UInt<n> a,b,c; donde "a, b, c" son variables y "n" es el tamaño de los números que puede almacenar en las variables en esta forma "2^(32 * n) -1" para sistemas de 32 bits y esta forma "2^(64 * n) -1" para sistemas de 64 bits

  • asignación de valores a variables de si hace esto a = 333; (y el número en lugar de 333 es más grande que el tipo de datos estándar "long int" en C++) no se compilará porque la asignación de valores a variables como esta independientemente del tamaño especificado anteriormente, el entero puede ser solo una es tan grande como el tipo de datos estándar "long int" en C++ (me lo figuré por mi cuenta, por las malas), incluso si usas un valor que es más pequeño y compila bien y luego ejecutas tu programa y intenta escribir en esta variable un número mayor que el número que el tipo de datos estándar "long int" mencionado puede manejar, entonces su matemática va a estar equivocada así que mire esto: para asignar un valor a una variable de la manera correcta tiene que asignarlo como a = "333"; (sí, sé que lo estás tratando como una cadena de esta manera, pero hará las operaciones bien sin ningún problema y si decides "cout" la variable nunca será un exponencial o el resultado de la notación científica es como obtener los tipos de datos enteros estándar sin combinar con algunas 'declaraciones extra' para mostrar el número correcto)

p.s. Usando estas simples reglas para trabajar con enteros y esta biblioteca, calculé los números de Fibonacci hasta el 100.Número 000 con un programa simple (que tardó 3 minutos en codificarse) en 15 a 20 segundos y el número ocupaba como 3 páginas, así que además de ser una biblioteca práctica una vez que sabes cómo funciona (que prácticamente no tenías ayuda antes, las muestras del sitio web ttmath son bastante engañosas, pero ahora sí que tiene alguna ayuda) también parece bastante eficiente, confirmé que el número 100.000 es probablemente correcto porque aumenté el tamaño (la "n") de 10000 a 50000 y el el número retuvo el tamaño y los dígitos iniciales y finales fueron los mismos. Este es el código fuente que utilicé, utilicé un número MUY GRANDE para el tamaño entero solo para probar, no me molesté en ver en qué duración comenzaría el programa a hacer cosas incorrectas, pero sé que la longitud de hasta el número 10.000 de Fibonacci no superará la duración que definí porque antes de esto hice que el programa 'cout' cada resultado hasta que llegó a 10.000 y siempre estaba creciendo. También verifiqué los primeros números de la secuencia antes cuando pause el programa y estaba viendo los 'dígitos crecer' y confirmé los primeros números de la secuencia de fibonacci y estaban correctos. NOTA: Este código fuente solo mostrará el número de la secuencia de fibonacci que desea conocer, solo le mostrará los números "creciendo" si descomenta las líneas comentadas.

#define TTMATH_DONT_USE_WCHAR 
#include <ttmath/ttmath.h> 
#include <iostream> 

using namespace std; 
int main() { 

int fibonaccinumber; 
cin >> fibonaccinumber; 
cin.ignore(); 

ttmath::UInt<10000> fibonacci1,fibonacci2,fibonacci3; 
fibonacci1 = 1; 
fibonacci2 = 1; 
//cout << "1. " << fibonacci1 << "\n2. " << fibonacci2 << "\n"; 

for(int i=3;i<=fibonaccinumber;i++) 
{fibonacci3 = fibonacci1 + fibonacci2; 
// cout << i << ". " << fibonacci3 << "\n"; 
fibonacci1=fibonacci2; 
fibonacci2=fibonacci3;} 

cout << "the " << fibonaccinumber << "th fibonacci number is " << fibonacci2; 

string endprog; 
getline(cin,endprog); 
return 0;} 

no me vanamente con flotadores de precisión arbitraria de este lbrary todavía, pero cuando lo hago voy a seguir ampliando esta guía si veo que la gente está interesada en él, gracias por todos los comentarios y respuestas.

+7

"Flotador de precisión" me parece un oxímoron. –

+1

Use mpir. Además, no hay una "solución rápida" para esto, la aritmética de precisión arbitraria bien hecha es una gran pregunta. –

+1

http://gmplib.org/ es una biblioteca bien mantenida. –

Respuesta

4

El sitio oficial (http://www.ttmath.org/) tiene samples de números enteros (ttmath::Int<2> a,b,c;) y flotantes (ttmath::Big<1,2> a,b,c;) ambos. Solo trátelos como de alta precisión int/float sin miembros y todo debería estar bien. Si el error persiste, ¿puede publicar el mensaje de error completo y las líneas de código con las que se produjo un error?

+0

Es por eso que utilicé "typedef ttmath :: UInt <100> BigInt;" para poder usar el tipo de BigInt como dijo el tipo en la publicación, entonces el problema no es eso. Además, el compilador "aceptó" la línea "typedef ttmath :: UInt <100> BigInt;" y solo me asusté cuando declare una variable como tipo BigInt. compiló un programa de ejemplo con carrozas, tal vez el tipo en la publicación que mencioné no es muy específico sobre qué hacer más tarde y de hecho es más complicado de lo que parece o tal vez se olvidó de algo importante allí. por favor la próxima vez no elimine el comentario, esta fue mi respuesta – wxiiir

+0

Luego tendrá que publicar el mensaje de error completo y las líneas de código erróneas o no podremos ayudarlo. –

+0

Creo que finalmente lo conseguí. Veré qué puedo hacer con esto y cuando pueda actualizar mi respuesta con mis hallazgos, su respuesta definitivamente me ayudó porque después de volver a leerlo comprendí que tal vez usted estaba tratando de decirme que no intente construye un tipo de ttmath y manténlo simple hasta que funcione. También había visto las muestras que tenían antes, pero no entendía nada, pero ahora creo que sí. PD sigo teniendo errores después de lo que dice el otro tipo, pero parece funcionar así (declarando variables usando ese código ttmath largo) así que lo mantendré de esta manera. – wxiiir

0

La biblioteca Boost.Multiprecision admite enteros arbitrariamente largos, números reales y proporciones. También le permite utilizar diferentes back-ends que tienen diferentes características de rendimiento y términos de licencia.