Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 13
  1. #1
    Utente di HTML.it
    Registrato dal
    Jun 2004
    Messaggi
    643

    [C] Memorizzare un numero con molte cifre decimali

    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:

    codice:
    #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

  2. #2
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,476
    Il codice dovrebbe essere

    codice:
        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 ...
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  3. #3
    Utente di HTML.it
    Registrato dal
    Jun 2004
    Messaggi
    643
    Originariamente inviato da oregon
    Il codice dovrebbe essere

    codice:
        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?=

  4. #4
    Utente di HTML.it
    Registrato dal
    Jul 2008
    Messaggi
    62
    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 :
    codice:
    #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.


  5. #5
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,476
    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 ?
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  6. #6
    Utente di HTML.it
    Registrato dal
    Jun 2004
    Messaggi
    643
    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?

  7. #7
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,476
    No ... l'ho provato su Windows e va bene ...

    Non hai risposto alla mia domanda ... hai scritto 10 o 10.0 ?
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  8. #8
    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.
    Amaro C++, il gusto pieno dell'undefined behavior.

  9. #9
    Utente di HTML.it
    Registrato dal
    Jun 2004
    Messaggi
    643
    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 :
    codice:
    #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.

    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

  10. #10
    Utente di HTML.it
    Registrato dal
    Jun 2004
    Messaggi
    643
    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

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.