PDA

Visualizza la versione completa : [C] Come rappresentare un valore maggiore di 4 miliardi


Zeldic
10-12-2010, 20:13
Salve, ragazzi! Non riesco a rappresentare dei dati numerici superiori al valore di un tipo di dato intero long unsigned int, che arriva per l'appunto ad un massimo valore di 4294967295. Mi serve per il mio programmino sull' n!. Per un n > 13 il programma visualizza in Output valori errati e pur sempre < di 4 mld. Quindi di che tipo di dato ho bisogno? Esiste in C?
Help me.

linoma
10-12-2010, 21:08
qui (http://it.wikipedia.org/wiki/Numero_intero_%28informatica%29) cmq credo che possa usare anche un double

MItaly
10-12-2010, 21:34
Il tuo fattoriale deve essere preciso all'intero o ti va bene anche perdere qualche cifra significativa (ti serve cioé più una stima di massima che il valore preciso)?

Zeldic
10-12-2010, 22:48
Originariamente inviato da MItaly
Il tuo fattoriale deve essere preciso all'intero o ti va bene anche perdere qualche cifra significativa (ti serve cioé più una stima di massima che il valore preciso)?




Ciao! Il mio programma deve restituire il valore preciso dell'n! di un n intero.

MItaly
10-12-2010, 23:11
Con gli interi a 64 bit (unsigned long long su gcc, unsigned int64 su VC++, uint64_t su tutti i compilatori che implementano correttamente stdint.h) dovresti guadagnare qualcosa, ma oltre il 20 non ci arrivi. Se ti servono valori "perfetti" l'unica è usare librerie per lavorare in precisione arbitraria (ad esempio la GMP (http://gmplib.org/)); in alternativa, puoi lavorare con i double, ma ovviamente perderai in precisione.

Zeldic
11-12-2010, 12:54
Originariamente inviato da linoma
qui (http://it.wikipedia.org/wiki/Numero_intero_%28informatica%29) cmq credo che possa usare anche un double




Grazie dei vostri preziosi suggerimenti. Ho dichiarato di tipo double sia la mia funzione 'fattoriale()', sia il dato in Output. Credo sia il tipo esatto per rappresentare il risultato nella maniera corretta, mi sembra più che soddisfacente. Il mio problema, inoltre, era che non conoscevo il placeholder, lo specificatore del tipo dell'argomento, riferito in particolar modo alla printf(). Il mio utilissimo libro di C di Kernighan & Ritchie ed il seguente link printf (http://cplusplus.com/reference/clibrary/cstdio/printf/) (scoperto grazie a GliderKite) mi hanno indicato la soluzione in :




printf("\nL'n! di %i e' il seguente ---> %.0f.\n\n\n", numero, risultato);



che mi consente di visualizzare correttamente l' n! e senza gli zeri dopo la virgola, che tanto non mi servono.





Con gli interi a 64 bit (unsigned long long su gcc, unsigned int64 su VC++, uint64_t su tutti i compilatori che implementano correttamente stdint.h) dovresti guadagnare qualcosa, ma oltre il 20 non ci arrivi. Se ti servono valori "perfetti" l'unica è usare librerie per lavorare in precisione arbitraria (ad esempio la GMP); in alternativa, puoi lavorare con i double, ma ovviamente perderai in precisione.




Purtroppo di questi tipi (che farebbero benissimo al caso mio) non ho trovato il corretto placeholder. Li ho provati tutti, %e, %E, %f, %g, %Ld, ..., ma il programma mi restituiva NULL, 0, o si interrompeva.

Inoltre non sono riuscita ad eseguire il download della libreria GMP, perché non so aprire il file con estensione .tar.lz.. :confused:

YuYevon
11-12-2010, 13:10
Su quale sistema stai lavorando e con quale compilatore?

MItaly
11-12-2010, 13:47
Originariamente inviato da Zeldic
Purtroppo di questi tipi (che farebbero benissimo al caso mio) non ho trovato il corretto placeholder.
Per long long si usa %lld, per uint64_t e in generale per gli interi di stdint.h si usano le macro di inttypes.h (http://pwet.fr/man/linux/conventions/posix/inttypes_h), per __int64 dovrebbe andare ancora bene %%ld.


Inoltre non sono riuscita ad eseguire il download della libreria GMP, perché non so aprire il file con estensione .tar.lz.. :confused:
Su che sistema operativo sei?

Zeldic
11-12-2010, 14:15
Originariamente inviato da YuYevon
Su quale sistema stai lavorando e con quale compilatore?




Windows 7 e lavoro col Dev-C++ 4.9.9.2.

MItaly
11-12-2010, 14:26
Originariamente inviato da Zeldic
Windows 7
Allora puoi usare IZArc o 7-Zip per decomprimere l'archivio in questione.


e lavoro col Dev-C++ 4.9.9.2.
:dhò:

Loading