Manejar enteros de longitud arbitraria en C ++

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

Solo consulte las bibliotecas que USTED usó y dígame cómo logró configurarlo y recogerlo, tal vez con un ejemplo muy minimalista o algo (básicamente, si la biblioteca mencionada carece de buena documentación, proporcione algunos datos propios). @

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

Bibliotecas que probé:

vlint (no hay suficientes operaciones, funciona bien para cosas pequeñas)

bigint (fácil de configurar, errores de compilación y poca documentación (de la cual se pueden derivar errores))

ttmath (parecía prometedor, compiló algunos programas de ejemplo GRANDES y ejecutó 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)

PD. Se eliminó la 'parte despotricada de la pregunta' que básicamente explicaba por qué estoy preguntando algo que se hizo muchas veces en Stackoverflow para que la gente lo leyera hasta el final.

-> ACTUALIZAR

Así que elegí una respuesta que no era una respuesta directa a mi pregunta inicial, pero me ayudó mucho a resolver esto y publicaré algunos de mis hallazgos para ayudar a otros novatos de C ++ como yo a comenzar a trabajar con números muy grandes sin luchar con bibliotecas durante días como lo hice en una micro guía fácil paso a paso.

Stuff estaba usando (tenga esto en cuenta para seguir la guía):

Windows 7 Ultimate x64

Amd k10 x64 (algunas bibliotecas no funcionarán con esto, otras se comportarán de manera diferente, otras están personalizadas para amd k10, por lo que esto no solo lo ayudará con la biblioteca que usé, sino posiblemente también con otras)

Code :: Blocks 10.05 la versión sin MinGW incluida, nombre de archivo "codeblocks-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" descomprimió y copió la carpeta "ttmath" a la carpeta "C: \ CPPLibs" (que es la carpeta donde puse mis bibliotecas de C ++)

Qué hacer para configurarlo todo

Vaya al Código: Bloques> Configuración> Compilador y depurador (Mi compilador se detectó automáticamente aquí. Si esto no sucede contigo, en "Compilador seleccionado", seleccione "Compilador GNU GCC" y haga clic en "Establecer como predeterminado" y luego en "Ejecutables de Toolchain" en "Directorio de instalación de compiladores", puede elegir el directorio de instalación del compilador o intentar detectarlo automáticamente y con eso ordenado en "C ++ Compiler", seleccione o escriba "mingw32-g ++. exe". @ Si esto te sucede simplemente haga esto, en "Compilador seleccionado" seleccione "Compilador GNU GCC" y haga clic en "Establecer como predeterminado").

Sin salir de "Código: Bloques> Configuración> Compilador y depurador" y con lo anterior ordenado, vaya a "Buscar directorios" y luego "Compilador", haga clic en "Agregar" y elija la carpeta donde almacena sus bibliotecas o donde guarda su carpeta "ttmath" (en mi caso C: \ CPPLibs) luego vaya a "Linker" y haga lo mismo.

ara comenzar a codificar con la biblioteca "ttmath", debe poner esta línea#include <ttmath/ttmath.h> antes de la función principal NOTA Si usa un sistema de 64 bits, recibirá muchos errores si no pone esta línea#define TTMATH_DONT_USE_WCHAR ANTES D esta línea#include <ttmath/ttmath.h>, estaba luchando con esta basura hasta que encontré la solución que otro tipo que también estaba luchando encontró y publicó en la web y funcionó para mí) p.s. creo que es solo para sistemas de 64 bits, pero si obtiene errores solo por incluir el archivo de encabezado "ttmath.h", es muy probable que sea por eso.

Declarando variables que tendrá valores enteros grandes tiene que hacerse así:ttmath::UInt<n> a,b,c; donde "a, b, c" son sus variables y "n" es el tamaño de los números que puede almacenar en las variables en este formulario "2 ^ (32 * n) -1" para sistemas de 32 bits y este formulario "2 ^ (64 * n) -1 "para sistemas de 64 bits

Asignación de valores a variables Si haces estoa = 333; (y el número en lugar de 333 es mayor que el tipo de datos estándar "int largo" en c ++) no se compilará porque al asignar valores a variables como esta independientemente del tamaño que especificó anteriormente, el entero puede ser tan grande como el tipo de datos estándar "long int" en c ++ (lo imaginé por mi cuenta, de la manera difícil), incluso si usa un valor que es más pequeño y se compila bien y luego ejecuta su programa e intenta escribir a esta variable, un número mayor que el número que el tipo de datos estándar "int largo" mencionado puede manejar, entonces su matemática será incorrecta, así que observe esto: para asignar un valor a una variablela direccion correct tienes que asignarlo asía = "333"; (sí, sé que lo estás tratando como una cadena de esta manera, pero funcionará bien sin ningún problema y si decides "eliminar" la variable, nunca será un resultado de notación exponencial o científica como obtienes usando tipos de datos enteros estándar sin estar unidos a algunas 'declaraciones adicionales' para mostrar el número correcto)

PD. Usando estas reglas simples para trabajar con enteros y esta biblioteca, calculé números de Fibonacci hasta el número 100,000 con un programa simple (que tardó 3 minutos en codificar) en 15 a 20 segundos y el número ocupó como 3 páginas, por lo que además de ser práctico biblioteca una vez que conozca cómo funciona (que prácticamente no tenía ayuda antes, algunas muestras del sitio web ttmath son bastante engañosas, pero ahora sí tiene algo de ayuda) también parece bastante eficiente, confirme que el número 100.000 es probablemente correcto porque aumenté el tamaño (la "n") de 10000 a 50000 y 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, en realidad no me molesté en ver en qué longitud comenzaría el programa a hacer cosas mal, pero sé que la longitud de hasta el número de Fibonacci número 10.000 no superará la longitud que definí porque antes de esto hice que el programa 'cout' cada resultado hasta llegar a 10.000 y siempre estaba creciendo. También verifiqué los primeros números de la secuencia antes cuando detuve el programa y vi que los 'dígitos crecían' y confirme los primeros números de Fibonacci de la secuencia y eran correctos. @NOTA Este código fuente solo mostrará el número de la secuencia de Fibonacci que desea saber, solo le mostrará los números "en crecimiento" 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;}  

Todavía no manipulé con flotaciones de precisión arbitraria de este lbrary, pero cuando lo haga, continuaré ampliando esta guía si veo que la gente está interesada en ella, gracias por todos los comentarios y respuestas.

Respuestas a la pregunta(3)

Su respuesta a la pregunta