Questo sito utilizza cookies, anche di terze parti, per mostrare pubblicità e servizi in linea con il tuo account. Leggi l'informativa sui cookies.
Username: Password: oppure
C/C++ - Caduta di un grave con g variabile
Forum - C/C++ - Caduta di un grave con g variabile

Avatar
ape96 (Normal User)
Newbie


Messaggi: 6
Iscritto: 02/11/2011

Segnala al moderatore
Postato alle 19:18
Domenica, 15/09/2013
Ciao a tutti! :D

Ho un problema da risolvere utilizzando C++, e mi è tornato in mente questo forum!

Vado al punto, il problema è questo:

"Facendo cadere un grave da 100m di altezza sul pianeta Terra, esso impiega un determinato tempo a cadere se la g considerata è di 9.81 m/s^2. Realizzare un programma in C++ che calcoli la g ogni millimetro, e che quindi restituisca un tempo più accurato."

Infatti 9.81 è un'approssimazione.

I problemi che ho incontrato sono due, uno più strettamente sul linguaggio e uno più sulla fisica.

Non sono stato in grado di assegnare ad una variabile la massa della terra, infatti questa è troppo grande per essere scritta come numero normale! Ho utilizzato la variabile "long long", ma nemmeno in questo modo sono riuscito a fargliela leggere correttamente.
Ho mezzo una pezza in questo modo:

Codice sorgente - presumibilmente C#

  1. #include<iostream>
  2. #include<cmath>
  3. #include<stdlib.h>
  4. using namespace std;
  5. int main()
  6. {
  7.     long double M=5.9736;
  8.     M=M*10000000000000000;
  9.     long double r,h,G,g,t,i,c,ttot,rr,v;
  10.     v=0;
  11.     h=100;
  12.     g=9.81;
  13.     G=0.0000000000667;
  14.     // M=5973600000000000000;
  15.     r=6372797;
  16.     ttot=0;
  17.     t=sqrt((h/(g/2)));
  18.     cout<<"Il grave si trova a 100 m di altezza.";
  19.     cout<<" Se cade con una accelerazione costante di 9,81 m/s^2, impiega "<<t<<" secondi ad arrivare al suolo."<<endl;
  20.     c=(h*1000)-1;
  21.     r=6372797+h;
  22.     t=sqrt((0.001+(v*t))/(g/2));
  23.     v=v+(0.001/t);
  24.    for (i=0; i<c; i++)
  25.     {
  26.         rr=(r*r)/100000000;
  27.        g=G*(M/(rr));
  28.     t=((v*-1)+sqrt((v*v)+(4*(g/2)*0.001))/g);
  29.     v=v+(0.001/t);
  30.     r=r-0.001;
  31.      }
  32. cout<<"Calcolando la g ogni millimetro percorso, il grave cade in "<<g<<" secondi."<<endl;
  33. system("pause");
  34. return 0;
  35. }



Ho semplicemente "spostato" delle potenze di 10 dal numeratore (massa Terra) al denominatore (raggio Terra), ma vorrei capire se ci fosse un metodo migliore.

Infine, i due output dovrebbero essere veramente molto simili dato che anche ricalcolando la g non c'è tutta questa differenza, tuttavia mi vengono circa 2 decimi di secondo di differenza, che mi sembrano troppi: se qualcuno ha idee sono ben accette!

Mi rendo conto che quest'ultima parte è più un problema di fisica che di informatica, per cui anche solo capire quella questione degli 0 mi andrebbe bene ^^

Grazie mille!


Tutti muoiono, ma non tutti vivono veramente.
PM Quote
Avatar
pierotofy (Admin)
Guru^2


Messaggi: 6116
Iscritto: 04/12/2003

Segnala al moderatore
Postato alle 1:14
Lunedì, 16/09/2013
Per questo genere di applicazioni dovresti usare una libreria come GMP (http://gmplib.org/).

Float e double sono approssimazioni dei numeri reali, e quando cominci ad aver bisogno di un certo livello di precisione (come nel caso di questo problema), e' normale avere dei problemi di arrotondamento.

Ad esempio, non c'e' modo di rappresentare in maniera precisa il valore 0.1 usando lo standard IEEE. http://docs.python.org/release/2.2.3/tut/node14.html



Seguimi su Twitter: http://www.twitter.com/pierotofy

Fai quello che ti piace, e fallo bene.
PM Quote
Avatar
ape96 (Normal User)
Newbie


Messaggi: 6
Iscritto: 02/11/2011

Segnala al moderatore
Postato alle 19:44
Martedì, 17/09/2013
Ciao!

Ti ringrazio per la risposta, tuttavia non ho avuto bisogno di usare quella libreria: i calcoli eseguiti probabilmente non richiedevano una precisione così alta, dato che l'errore che facevo era un problema proprio del calcolo, non della approsimazione del compilatore!

Tuttavia il mio prof mi ha suggerito di scrivere i numeri usando la notazione "E", in questo modo ho potuto utilizzare tranquillamente la mia massa della Terra, la mia costante gravitazionale ecc.

Dopo essermi rimesso qua son riuscito finalmente a farlo! Ora è giusto. Posto il codice per chi ne avesse bisogno...

Codice sorgente - presumibilmente C++

  1. #include<iostream>
  2. #include<cmath>
  3. #include<stdlib.h>
  4. using namespace std;
  5. int main()
  6. {
  7. const float M=5.9736E24, G=6.67E-11;
  8. float g,h,i,t,v,ttot,c,r;
  9. r=6372797;
  10. h=100;
  11. g=9.81;
  12. v=0;
  13. ttot=0;
  14. t=sqrt((h/(g/2)));
  15.     cout<<"Il grave si trova a 100 m di altezza.";
  16.     cout<<" Se cade con una accelerazione costante di 9,81 m/s^2, impiega "<<t<<" secondi ad arrivare al suolo."<<endl;
  17. c=1000*h;
  18. r=r+h;
  19. t=sqrt((0.001+(v*t))/(g/2));
  20. v=v+(g*t);
  21. ttot=t;
  22.     for (i=0; i<c; i++)
  23.     {
  24.        g=G*(M/(r*r));
  25.        t=(-v+sqrt((v*v)+2*g*0.001))/g;
  26.        v=v+(g*t);
  27.        r=r-0.001;
  28.        ttot=ttot+t;
  29.    }
  30.     cout<<"Calcolando la g ogni millimetro percorso, il grave cade in "<<ttot<<" secondi."<<endl;
  31. system("pause");
  32. return 0;
  33. }



Tutti muoiono, ma non tutti vivono veramente.
PM Quote