PDA

View Full Version : [C++] Numeri grassi grassi


Jonny32
26-01-2005, 21:17
Avevo in mente di fare dei programmi di calcolo matematico (tipo calcolo del Pi greco o roba del genere...) e quindi mi interessava di poter lavorare con numeri con molte cifre (long double nn mi basta).
Avete mai fatto cose del genere? (se si datemi qualche consiglio... :sbav: )

Io avevo in mente di gestire i numeri come dei vettori (di tipo int) grandi a piacere... in questo modo però dovrei ridefinire le operazioni (somma, moltiplicazione, radice quadrata, ecc...)?

Voi avete qualche idea?

RBlade79
27-01-2005, 08:13
Prova ad usare le librerie MIRACL...sono state create per definire e gestire numeri molto grandi (vengono usate per giocare con gli algoritmi crittografici...).
Prova a dare un'occhiata QUI (http://indigo.ie/~mscott/)

RaouL_BennetH
27-01-2005, 18:27
Da quel poco che ne so, mi sembra che però il C++ non sia il linguaggio più indicato per fare quello che vorresti; se non erro c'è il fortran che più si adatta allo scopo. O devi operare per forza di cose in C++ ?

cionci
28-01-2005, 14:46
Originariamente inviato da Jonny32
Io avevo in mente di gestire i numeri come dei vettori (di tipo int) grandi a piacere... in questo modo però dovrei ridefinire le operazioni (somma, moltiplicazione, radice quadrata, ecc...)?

Ovvio che dovresti ridefinirti le operazioni...non è difficile comunque da fare... In teoria, se dovessi lavorare sugli interi (anche se si può generalizzare a numeri in virgola fissa) potresti fare operazioni definendo ogni cifra come un intero 2^32... Non è complesso... Ti cerco qualcosa...

Jonny32
28-01-2005, 16:24
Intanto grazie a tutti delle risposte...

Originariamente inviato da RaouL_BennetH
Da quel poco che ne so, mi sembra che però il C++ non sia il linguaggio più indicato per fare quello che vorresti; se non erro c'è il fortran che più si adatta allo scopo. O devi operare per forza di cose in C++ ?


Questa cosa che ho in mente la vorrei fare in c++ anche perchè conosco solo quello e il vb6 (purtroppo...)

Originariamente inviato da cionci [/B]
In teoria, se dovessi lavorare sugli interi (anche se si può generalizzare a numeri in virgola fissa) potresti fare operazioni definendo ogni cifra come un intero 2^32...


:huh: :uh:

^TiGeRShArK^
30-01-2005, 21:31
e utilizzando direttamente un array di bit???

cionci
31-01-2005, 01:21
Originariamente inviato da Jonny32
:huh: :uh:
Immaginati uno scatolotto che fa la somma fra due numeri in base dieci...

Questo scatolotto a 3 ingressi, A e B (i due operandi), Cin il riporto in ingresso...

E due uscite...Res (risultato) E Cout il riporto in uscita...

Res = (A + B + Cin) % 10 (modulo 10)

Res = (5 + 6) % 10 = 1

Cout = 1 se A + B >= 10

Questo stesso discorso lo puoi fare per un numero in base 2^32:

Res = (A + B + Cin) % 2^32

Cout = 1 se A + B >= 2^32

Se metti due scatolotti in fila (il Cout del primo entra nel Cin del secondo) hai fatto un sommatore a 64 bit ;)

Gli ingressi del primo blocco saranno i primi 32 bit degli operandi, gli ingressi del secondo saranno i secondi 32 bit...

E così via virtualmente all'infinito...

pipozzolo
01-02-2005, 10:46
Originariamente inviato da cionci
Immaginati uno scatolotto che fa la somma fra due numeri in base dieci...

Questo scatolotto a 3 ingressi, A e B (i due operandi), Cin il riporto in ingresso...

E due uscite...Res (risultato) E Cout il riporto in uscita...

Res = (A + B + Cin) % 10 (modulo 10)

Res = (5 + 6) % 10 = 1

Cout = 1 se A + B >= 10

Questo stesso discorso lo puoi fare per un numero in base 2^32:

Res = (A + B + Cin) % 2^32

Cout = 1 se A + B >= 2^32

Se metti due scatolotti in fila (il Cout del primo entra nel Cin del secondo) hai fatto un sommatore a 64 bit ;)

Gli ingressi del primo blocco saranno i primi 32 bit degli operandi, gli ingressi del secondo saranno i secondi 32 bit...

E così via virtualmente all'infinito...

Questo è molto semplice per i numeri interi ma non lo è altrettanto per i numeri frazionari (credo sia quello che cercava), seguendo il formato IEEE bisogna ridefinire segno esponente e mantissa e reimplementare tutti gli operandi... niente di allucinante ma è un pò più complesso.
Comunque credo che qualcosa di già pronto si trovi, visto che se non sbaglio tramite SSE/SSE2 erano state introdotte molte istruzioni per operare su dati di grosse dimensioni.

cionci
02-02-2005, 07:56
Originariamente inviato da pipozzolo
Questo è molto semplice per i numeri interi ma non lo è altrettanto per i numeri frazionari (credo sia quello che cercava),

Dipende...se si implementa un sistema a virgla fissa è assolutamente identico ;) Anzi...volendo si potrebbe anche implementare un sistema in virgola mobile a cifre infinite...