PDA

View Full Version : gestione numeri float in c


c&c
09-06-2006, 10:00
ciao a tutti...
dovrei gestire almeno un centinaio di numeri decimali ma utilizzando un semplice numero float riesco a gestirne al massimo 15. come posso fare?
byez

thebol
09-06-2006, 10:03
ciao a tutti...
dovrei gestire almeno un centinaio di numeri decimali ma utilizzando un semplice numero float riesco a gestirne al massimo 15. come posso fare?
byez

utilizzare un float double?

trallallero
09-06-2006, 10:17
ciao a tutti...
dovrei gestire almeno un centinaio di numeri decimali ma utilizzando un semplice numero float riesco a gestirne al massimo 15. come posso fare?
byez

un centinaio di numeri decimali ?
intendi numeri con cifre decimali ?
io conosco i numeri reali, interi, complessi, positivi, negativi ... ma decimali no :confused:

c&c
09-06-2006, 10:19
intendo numeri reali, quelli con la virgola... ma a me interessa che abbiano un centinaio di numeri dopo la virgola... es: 2,1111111111111111111111
9265275287847284728472
472987284721094810984
9265275287847284728472
4729872847210948109849265275287847284728472
4729872847210948109849265275287847284728472
4729872847210948109849265275287847284728472
4729872847210948109849265275287847284728472
4729872847210948109849265275287847284728472
472987284721094810984

trallallero
09-06-2006, 10:33
intendo numeri reali, quelli con la virgola... ma a me interessa che abbiano un centinaio di numeri dopo la virgola... es: 2,1111111111111111111111
9265275287847284728472
472987284721094810984
9265275287847284728472
4729872847210948109849265275287847284728472
4729872847210948109849265275287847284728472
4729872847210948109849265275287847284728472
4729872847210948109849265275287847284728472
4729872847210948109849265275287847284728472
472987284721094810984

io ho provato con un double:


#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main ()
{
double d = 0.1234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890;
printf( "%i\n", sizeof(double) );
printf( "%0.100f\n", d );

}


output:
0.1234567890123456773698862320998159702867269515991210937500000000000000000000000000000000000000000000

si perde i dati anche il double.

Scusa se mi faccio i fatti tuoi .... ma che ci devi fare con 100 decimali ? :eek:

andbin
09-06-2006, 10:34
utilizzando un semplice numero float riesco a gestirne al massimo 15No, il float ha solo 7~8 cifre significative, il double ne ha 15~16 e il long double ne ha 19~20.
Se hai bisogno di più cifre significative ... molte di più ... dovresti usare una qualche libreria esterna per la gestione dei numeri in virgola mobile a "precisione arbitraria".
In Java, per esempio, esiste la classe BigDecimal. Per il C/C++ credo (e spero) che ci siano delle librerie simili/equivalenti.

andbin
09-06-2006, 10:42
The GNU MP Bignum Library (http://www.swox.com/gmp/)

c&c
09-06-2006, 11:09
grazie... abbiamo trovato la libreria per windows.
ora devo capire come si usa. esiste un manuale o qualcosa di simile?

byez

c&c
09-06-2006, 12:08
Abbiamo seguito tutti i passi per farlo funzionare su WIN. Ora la mia domanda è questa, qualè la differenza tra la versione Static e quella Dinamic.. Non esistono altre libreri più semplici per il C, sempre da usare sotto WIN..
..byez,,

andbin
09-06-2006, 15:14
Abbiamo seguito tutti i passi per farlo funzionare su WIN.Quale libreria hai poi preso? Quella che ho indicato io?

Ora la mia domanda è questa, qualè la differenza tra la versione Static e quella Dinamic.. Se usi la libreria in versione statica, essa viene "inglobata" nel tuo eseguibile. Se usi quella dinamica, essa rimane come file DLL separato, a cui il tuo eseguibile farà poi riferimento.

c&c
09-06-2006, 17:57
sono riuscito ad usare questa libreria, ma sotto linux...

ho provato in windows con devc++ ma non so come aggiungere l'opzione -lgmp che utilizzo in linux con gcc.

in alternativa posso compilarlo con gcc in modo che funzioni sotto windows? o con altri compilatori!

byez

andbin
09-06-2006, 18:13
ho provato in windows con devc++ ma non so come aggiungere l'opzione -lgmp che utilizzo in linux con gcc.Con il Dev-C++ vai nelle "proprietà del progetto" e lì ci dovrebbe essere un campo apposito dove inserire i parametri x il linker.

c&c
10-06-2006, 09:47
ora riesco ad utilizzare la libreira anche in windows... e fin qui tutto ok.

ora però mi da problemi quando tento di aumentare di molto la precisione, sopra 100000 cifre decimali...

mi da problemi di "segmentation fault". si può risolvere il problema allocando memoria con la malloc?

byez

Gavrila
10-06-2006, 10:37
ora riesco ad utilizzare la libreira anche in windows... e fin qui tutto ok.

ora però mi da problemi quando tento di aumentare di molto la precisione, sopra 100000 cifre decimali...

mi da problemi di "segmentation fault". si può risolvere il problema allocando memoria con la malloc?

byez


non per farmi gli affari tuoi, ma 10^5 cifre decimali, a che ti servono???

c&c
10-06-2006, 10:45
mi serve per un progetto di matematica...

byez

tomminno
10-06-2006, 11:47
mi serve per un progetto di matematica...

byez

Mi sa che ti servirebbe qualcosa di meglio dal punto di vista hardware.
Scusa ma che progetto è?
10^-100000 non è una grandezza di nessun interesse per nessun campo che io conosca.
Vorrai mica calcolare il pi greco con quella precisione?

c&c
11-06-2006, 10:16
Mi sa che ti servirebbe qualcosa di meglio dal punto di vista hardware.
Scusa ma che progetto è?
10^-100000 non è una grandezza di nessun interesse per nessun campo che io conosca.
Vorrai mica calcolare il pi greco con quella precisione?
no, il numero e ;).. cmq dici che sia colpa dell'HW se mi esce l'errore Segmentation Fault? Non è possibile che il mio programma che allochi ad esempio 200K nella memoria (RAM) ed esco fuori dal range?
..byez,,
..ps: basta con la domanda: ma a che ti serve calcolare 10^5 numeri dopo la virgola..

tomminno
11-06-2006, 11:48
no, il numero e ;).. cmq dici che sia colpa dell'HW se mi esce l'errore Segmentation Fault? Non è possibile che il mio programma che allochi ad esempio 200K nella memoria (RAM) ed esco fuori dal range?
..byez,,
..ps: basta con la domanda: ma a che ti serve calcolare 10^5 numeri dopo la virgola..

Il sito riporta che spesso la libreria viene mal compilata, il segmentation fault può dipendere da questo o da un utilizzo errato nel codice.
Bisognerebbe vedere il codice dove ti dà l'errore.
Alla fine la memoria occupata per calcolare 100000 cifre è 800KB.

c&c
12-06-2006, 11:10
Controllerò e poi ti faccio sapere..
..byez,,