Qualcuno può dirmi una buona libreria C++ per la gestione (operazioni, ecc.) Con numeri arbitrariamente grandi (può essere una libreria che gestisce anche float di precisione arbitraria, ma gestire gli interi è più importante)?Gestire interi di lunghezza arbitraria in C++
Si prega di fare riferimento solo alle librerie che hai usato e dimmi come sei riuscito a configurarlo e raccoglierlo, magari con un esempio molto minimalista o qualcosa del genere (in pratica se la libreria menzionata manca di buona documentazione fornisci qualche input del tuo proprio).
Per la cronologia sto utilizzando Windows 7 su una macchina x64, CodeBlocks come IDE e l'ultimo MinGW come compilatore.
Biblioteche ho provato:
vlint (non abbastanza operazioni, funziona bene per le piccole cose però)
bigint (facile per configurarlo, errori di compilazione e non molto di documentazione (da cui errori potrebbero essere derivati))
ttmath (sembrava promettente, compilato alcuni programmi di esempio BIG e correva dopo alcune correzioni a causa di errori di compilazione, sintassi incomprensibile a causa di praticamente nessuna documentanzione)
GMP (non poteva anche configurarlo)
P.S. Rimosso la "parte irrisolta della domanda" che in pratica spiegava perché sto chiedendo qualcosa che è stato chiesto molte volte su Stackoverflow, così la gente lo avrebbe letto fino alla fine.
-> UPDATE
così ho preso una risposta che non è stata una risposta diretta alla mia domanda iniziale, ma mi ha aiutato molto per risolvere questo e mi post alcune delle mie scoperte per aiutare gli altri C++ neofiti come me per iniziare a lavorare con numeri molto grandi senza lottare con le librerie per giorni come ho fatto in una facile guida passo-passo.
roba che stavo usando (tenere questo in mente di seguire la guida):
Windows 7 Ultimate x64
Amd K10 x64 (alcune librerie non lo farà lavorare con questo, gli altri si comportano in modo diverso, altri sono personalizzati su amd k10 quindi questo non solo ti aiuterà con la libreria che ho usato, ma probabilmente anche con altri)
Code :: Blocks 10.05 la versione senza MinGW inclusa, nome del file "CodeBlocks-10.05-setup.exe" (installato su C: \ Program Files (x86) \ CodeBlocks)
pacchetti 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) estratto in C: \ MinGW
TTath 0.9.2 nome file "ttmath-0.9.2-src.tar.gz" decompresso e copiato la cartella "ttmath" nella cartella "C: \ CPPLibs" (che è la cartella in cui ho inserito le mie librerie C++)
Cosa fare per impostare il tutto
Vai a Codice: Blocchi> Impostazioni> compilatore e Debugger (il mio compilatore è stato rilevato automaticamente qui Se questo non accade con voi. , in "Compilatore selezionato" selezionare "GNU GCC Compiler" e fare clic su "Imposta come predefinito", quindi su "Toolchain Exectables" su "C directory di installazione dei compilatori è possibile scegliere la directory di installazione del compilatore o tentare di rilevare automaticamente "e con quello ordinato su" C++ Compiler "selezionare o scrivere" mingw32-g ++. exe ". Se ciò accade a te, fai semplicemente clic su "Compilatore selezionato", seleziona "GNU GCC Compiler" e fai clic su "Imposta come predefinito").
Senza lasciare "Codice: Blocchi> Impostazioni> Compilatore e Debugger" e con quanto sopra risolto, andare su "Ricerca directory" e poi "compilatore" clic su "Aggiungi" e scegliere la cartella in cui memorizzare le librerie o dove metti la cartella "ttmath" (nel mio caso C: \ CPPLibs) poi vai su "Linker" e fai la stessa cosa.
Per iniziare a scrivere codice con la libreria "ttmath" bisogna mettere questa riga
#include <ttmath/ttmath.h>
prima della funzione main (NOTA: Se si utilizza un sistema a 64 bit si otterrà un sacco di errori se non si ha anche messo questa riga#define TTMATH_DONT_USE_WCHAR
PRIMA di questa riga#include <ttmath/ttmath.h>
, stavo lottando con questa merda fino a quando ho trovato la correzione che qualche altro ragazzo che era anche faticoso trovato e pubblicato sul web e ha funzionato per me) ps Penso che sia solo per sistemi a 64 bit, ma se ottieni errori solo perché includi il file di intestazione "ttmath.h" è molto probabile a causa di ciò.Dichiarazione variabile che avrà valori grandi interi deve essere fatto in questo modo:
ttmath::UInt<n> a,b,c;
dove "a, b, c" sono le variabili e "n" è la dimensione dei numeri è possibile memorizzare le variabili in questa forma "2^(32 * n) -1" per i sistemi a 32 bit e questa forma "2^(64 * n) -1" per sistemi a 64 bitAssegnazione valori alle variabili se si esegue questa
a = 333;
(e il numero al posto di 333 è più grande del tipo di dati standard "long int" su C++) non verrà compilato perché l'assegnazione di valori a variabili come questa indipendentemente dalla dimensione specificata in precedenza potrebbe essere solo un è grande come il tipo di dati standard "long int" su C++ (ho immaginato questo da solo, nel modo più duro), anche se si usa un valore più piccolo e si compila bene e poi si esegue il programma e prova a scrivere su questa variabile un numero maggiore del numero che il tipo di dati standard "long int" menzionato può gestire, quindi la tua matematica sarà sbagliata quindi guarda questo: assegnare un valore a una variabile nel modo giusto tu devo assegnarlo in questo modoa = "333";
(sì, so che lo stai trattando come una stringa in questo modo ma funzionerà perfettamente senza alcun problema e se decidi di "cout" la variabile non sarà mai esponenziale o la notazione scientifica risulta come se si utilizzassero tipi di dati interi standard senza essere accoppiati con alcune "dichiarazioni extra" per visualizzare il numero giusto)
p.s. Usando queste semplici regole per lavorare con numeri interi e questa libreria ho calcolato i numeri di Fibonacci fino a 100.Numero 000 con un programma semplice (che ha richiesto 3 minuti per il codice) in 15-20 secondi e il numero occupato come 3 pagine quindi oltre ad essere una libreria pratica una volta capito come funziona (che non avevi praticamente nessun aiuto prima, alcuni esempi del sito Web di ttmath sono piuttosto ingannevoli, ma ora hai qualche aiuto) anche se sembra abbastanza efficiente, ho confermato che il 100.000esimo numero è probabilmente giusto perché ho aumentato la dimensione (la "n") da 10000 a 50000 e il il numero ha mantenuto la dimensione e le cifre iniziali e finali erano le stesse. Questo è il codice sorgente che ho usato, ho usato un numero MOLTO GRANDE per la dimensione intera solo per testare, in realtà non mi sono preoccupato di vedere su quale lunghezza il programma avrebbe iniziato a fare cose sbagliate ma so che la lunghezza di fino a il 10.000esimo numero di fibonacci non supererà la lunghezza che ho definito perché prima di questo ho reso il programma "cout" ogni risultato fino a raggiungere il 10.000esimo ed era sempre in crescita. Ho anche controllato i primi numeri della sequenza prima quando ho messo in pausa il programma e vedevo le 'cifre crescere' e ho confermato i primi numeri di Fibonacci della sequenza ed erano corretti. NOTA: Questo codice sorgente mostrerà solo il numero della sequenza di Fibonacci che si desidera conoscere, ma mostrerà solo i numeri "in crescita" se si decommentano le righe commentate.
#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;}
non ho armeggiato con i galleggianti precisione arbitraria di questo lbrary ancora, ma quando lo faccio io continuerò a espandere questa guida se vedo che le persone sono interessati in esso, grazie per tutti i commenti e risposte.
"Precision float" mi sembra un ossimoro. –
Usa mpir. Inoltre non esiste una "soluzione rapida" per questo, aritmetica precisione arbitraria eseguita bene è una grande cosa da chiedere. –
http://gmplib.org/ è una libreria ben gestita. –