PDA

Visualizza la versione completa : [C] Memorizzare un numero con molte cifre decimali


D4rkAng3l
07-11-2008, 13:00
Ciao,
ho l'esigenza di memorizzare in una variabili il valore fisico della costante di gravitazione universale G che è pari a: 6.674 * 10^(-11) quindi sarà un numero molto piccolo vicino allo 0 e con tante cifre decimali dopo la virgola.

Ho provato a fare di questo:



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

int main(){
long double G = 6.674 * pow(10,-11);

printf("%Lf\n", G);

system("pause");
return 0;
}


ma non funziona in quanto come potete vedere l'output che dà è:
-0.000000
Premere un tasto per continuare . . .

credo che devo memirizzare più cifre decimali...giusto? che tipo di dato dovrei usare?

Grazie
Andrea

oregon
07-11-2008, 13:28
Il codice dovrebbe essere



long double G = 6.674 * pow(10.0, -11.0);

printf("%.15Lf\n", G);


ma, in ogni caso, con simili quantita' e precisioni e' meglio usare una libreria apposita ... ne esistono su internet ...

D4rkAng3l
07-11-2008, 13:35
Originariamente inviato da oregon
Il codice dovrebbe essere



long double G = 6.674 * pow(10.0, -11.0);

printf("%.15Lf\n", G);


ma, in ogni caso, con simili quantita' e precisioni e' meglio usare una libreria apposita ... ne esistono su internet ...

guarda si tratta del primo esempio di un esema base di C e la persona che stò aiutando non può usare librerie strane....

cmq l'output che mi dàè questo adesso:
-0.000000000000000
Premere un tasto per continuare . . .non quello desiderato...why?=

mico90
07-11-2008, 14:45
Ciao,
non ho mai visto assegnare un attributo long ad un double, infatti il double ha gia una lunghezza complessiva ( mantissa + esponente ) di 64 bit.

Prova con questo :


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

int main(){
double G = 6.674 * (double)(pow(10,-11));

printf("%.20lf\n", G);

system("pause");
return 0;
}


printf("%.20lf\n", G) : il .20 dice alla printf di visualizzare le prime 20 cifre decimali del tuo numero in virgola mobile.

:ciauz:

oregon
07-11-2008, 15:10
Originariamente inviato da D4rkAng3l
guarda si tratta del primo esempio di un esema base di C e la persona che stò aiutando non può usare librerie strane....

Beh ... il problema allora non lo risolvi ...



cmq l'output che mi dàè questo adesso:
-0.000000000000000

Sicuro di avere scritto 10.0 (come ti ho mostrato) e non 10 ?

D4rkAng3l
07-11-2008, 20:07
Originariamente inviato da oregon
Beh ... il problema allora non lo risolvi ...



Sicuro di avere scritto 10.0 (come ti ho mostrato) e non 10 ?

mmm la cosa strana è che su linux funziona...mentre su windows no...è come se windows si fermasse a tipo 10^-6...fino a 10^-6 mi pare che funzioni bene...poi non memorizza più cifre dopo la virgola...su linux và...possibile?

oregon
07-11-2008, 21:52
No ... l'ho provato su Windows e va bene ...

Non hai risposto alla mia domanda ... hai scritto 10 o 10.0 ?

MItaly
07-11-2008, 22:55
Tra parentesi, il long double, come tutti i tipi predefiniti del C, non è definito ugualmente su tutte le piattaforme (lo standard C prescrive solo la precisione minima); ad esempio, sulla mia macchina Windows XP Visual C++ 7.1 lo definisce come uguale al double normale (64 bit), mentre su quella Linux AMD64 è grande il doppio. In sostanza, quindi, come già detto da oregon, se lavori su numeri del genere è meglio affidarsi a librerie apposite.

D4rkAng3l
08-11-2008, 12:05
Originariamente inviato da mico90
Ciao,
non ho mai visto assegnare un attributo long ad un double, infatti il double ha gia una lunghezza complessiva ( mantissa + esponente ) di 64 bit.

Prova con questo :


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

int main(){
double G = 6.674 * (double)(pow(10,-11));

printf("%.20lf\n", G);

system("pause");
return 0;
}


printf("%.20lf\n", G) : il .20 dice alla printf di visualizzare le prime 20 cifre decimali del tuo numero in virgola mobile.

:ciauz:

ok...così funziona...giustamente il casting lo faccio davanti alla funzione pow che mi pare di ricordare sputi fuori un float e non un double...

Io sono studente di informatica e stò al terzo anno...è un po' che non tocco C ma la teoria ce l'ho abbastanza buona...stò aiutando un ragazzo che stà al primo anno di fisica a passare l'esamino di programmazione...ora il fatto è che da me l'esame di C verteva principalmente su argomenti come allocazione dinamica della memoria, liste, operazioni ricorsive su matrici e blablabla....da loro queste cose più teoriche non ci stanno in quanto lo usano principalmente per fare conti...e ad essere onesto nei miei due esami di C non m'è mai capitato di dover usare tipi di dato per contenere dati grossi o per memorizzare valori esponenziali...dovrò anche far immettere valori con l'esponenziale all'utente...
Visto che questo è il suo primissimo programmino fatto a casa assegnatogli solo per fargli fare printf, scanf e fargli calcolare 2 conticini...non è che posso fargli usare librerie particolari anche perchè alle funzioni non ci sono neanche arrivati...cmq grazie dell'aiuto...a volte ho bisogno di rinfrescarmi un po' la memoria perchè negli ultimi 2 anni ho visto solo altri linguaggi come Java, Prolog, SQL e non ho toccato C :D

D4rkAng3l
08-11-2008, 14:01
Un altro piccolo chiarimento...
se ho l'esigenza di memorizzare cifre molto grandi del tipo:
5.9723*10^24 o molto piccole con molte cifre decimali dopo la virgola del tipo: 6.674*10^(-11) uso il tipo di dato double...vorrei capire bene come funziona questo tipo di dato però...se la parte intera prima della virgola èmolto grande toglie spazio alle cifre dopo la virgola e viceversa oppure il numero di cifre per la parte intera e per la parte decimale sono fissi?

Grazie
Andrea

Loading