E = mc² ??



  • Hi,
    bin hier grad am entwickeln von einem Programm wo sämtliche Phyikalische Formeln drin sind. Z.B. zur berechnung von Vektoren oder wie lange ein Gegenstand brauch bei einer angegebenen Anfangsgeschwindigkeit in einem 45° Winkel wieder auf die Erde zu treffen und wie weit er geflogen ist.
    Kann man sich dann aussuchen was man aussrechnen möchte.
    Sozusagen eine winzig, kleine Physik-Engine. :p

    Jetzt wollte ich die berühmte Formeln vom lieben Onkel Einstein inplementieren da aber die Energie die dabei rauskommt in Joule ausgegeben wird und schon ein Gegenstand mit 5 Kg 450000000000 Joule Energie hat bzw 450000000 Kilo Joule hat gibt der mir immer Minus-Werte aus!?! Warscheinlich weil ein Integer nicht so viel speichern kann.
    Aber wie kann ich denn so eine lange Zahl ausgeben?

    mfg
    Cl0v3r



  • Fuer physikalische Groessen bieten sich eigentlich immer Fliesskommazahlen an. Spricht double, oder wenn das noch nicht reicht long double.



  • Hmmm...
    Leider kriege ich immer so exotische Summen raus wie z.B. wenn ich die Energie eines Objektes mit dem Gewicht 10 kg haben will gibt er mir die (Kugel :p ) Zahl -1943132160 Joule !?!
    Da kann doch was nicht stimmen. Ich habe das Ergebnis auch als long double defeniniert.
    Bloss wenn ich nach der Rechnung das Ergebnis nochmal durch 1000 teile was bedeutet das ich Kilo-Joule rauskriege bekomme ich das richtige Ergebnis denn das Ergebnis ist ja jetzt um 3 Stellen kürzer.

    Gibt es denn eine Möglichkeit eine 12 Stellige Zahl zu speichern und korrekt auszugeben?

    mfg
    Cl0v3r



  • Überläufe bei Fließkommazahlen führen nicht dazu, daß die Zahlen negativ werden. Du rechnest bestimmt immer noch mit Ganzzahlen. Mach's so:

    /* immer nur SI-Einheiten */
    
    double const c = 3e8;
    
    double energieaquivalent(double masse) {
        return masse * c * c;
    }
    


  • Warte mal...
    Ich hab nie gesagt das ich überhaupt mit Fließkommazahlen rechne...
    Bei der Formel kommen nun mal Ganzzahlen raus wenn man z.B. nur einfache Ganzzahlen eintippt.

    E = 10*300000*300000 = 900000000000

    Also für mich ist das eine Ganzzahl oder denke ich jetzt falsch?
    Ich versteh denn Sinn jetzt nicht!?!

    Ausserdem habe ich schon vorher so ähnlich gerechnet:

    long double E = 0;
    	long double m = 0;
    	const double c = 300000;
    
            scanf("%d", &m);
    
            E = m*c*c;
    
            printf("%d Joule hat dieses Objekt!\n\n", E);
    

    mfg
    Cl0v3r



  • hm, kannst es vielleicht mal mit "long long" probieren



  • ...
    Meinst du das ernst 🙂 ?



  • Cl0v3r schrieb:

    Warte mal...
    Ich hab nie gesagt das ich überhaupt mit Fließkommazahlen rechne...
    Bei der Formel kommen nun mal Ganzzahlen raus wenn man z.B. nur einfache Ganzzahlen eintippt.
    [..]
    Also für mich ist das eine Ganzzahl oder denke ich jetzt falsch?
    Ich versteh denn Sinn jetzt nicht!?!

    Welchen Sinn ergibt dann deine Antwort auf SG1' Artikel? Naja, egal. Du kannst ziemlich problemlos alles mit double-Zahlen machen; Perl zB arbeitet intern immer mit Gleitkommazahlen und ist trotzdem benutzbar.

    long double E = 0;
    	long double m = 0;
    	const double c = 300000;
    
            scanf("%d", &m);
    

    long doubles liest man mit scanf("%Lg", &m), sonst kommt Unfug raus.

    printf("%d Joule hat dieses Objekt!\n\n", E);
    

    Hier muß es auch "%Lg" heißen.



  • Aber nicht Rik=0 ( ik steht wie ² versetzt nur nicht oben sondern unten)

    PS: bin ein einstein fan ( und verstehe das meiste was er sagte)



  • Cl0v3r schrieb:

    ...
    Meinst du das ernst 🙂 ?

    ja.



  • Daniel E. schrieb:

    Welchen Sinn ergibt dann deine Antwort auf SG1' Artikel?

    Gute Frage *lach* man man man...jetzt werden wir schon shizofren 🙂 🙂
    (Ich hab dir doch gesagt das das richtig ist! Jaaaaa is ja guuut...) 🤡

    Aber dickes THX hat gefunzt!

    @++++++++++++
    Auf jeden Fall! Er ist die Pop Ikone der Physik 😃

    Einstein schrieb:

    Holz hacken ist deshalb so beliebt, weil man bei dieser Tätigkeit den Erfolg sofort sieht.

    mfg
    Cl0v3r

    EDIT: Sorry aber wie dir vielleicht aufgefallen ist ist diese Anweisung unzulässig (long long). Bei meinem Compiler. Ich weiss nicht ob das mit anderen geht aber mit meinem Compiler nicht.



  • hm, also irgendwie ging das. wenn du windows.h inkludierst kannst du auch LONGLONG nehmen, aber da dein problem eh gelöst ist, is auch egal.



  • Aso...
    Naja die hab ich ja nich included.
    Das wusste ich nicht.
    Trotzdem danke vielleicht hilft mir das später nochmal wenn ich sowas brauche.

    mfg
    Cl0v3r



  • long long ist seit C99 im Standard. Einige Compiler konnten ihn schon früher (z.B. gcc), aber manche offensichtlich immernoch nicht 😉



  • Hi,
    Hab das mal ausgeprobst die windows.h zu includen und dann gucken:
    Stimmt auch wenn ich die Lib windows.h include kann ich keine long long deklarieren bzw initialisieren.
    Schade...
    Hab gedacht Microsoft wäre auf dem neusten Stand... *LACH* 😃
    Naja, lächerlich 🤡

    Wäre zu schön gewesen...

    mfg
    Cl0v3r



  • auch die konstanten müssen double sein! also

    double E = 10.0*300000.0*300000.0;
    

    sonst rechnet der compiler den ausdruck 10*300000*300000 intern erst mal mit integer aus und da gibst dann den überlauf. und da hilfts dann auch nichts mehr, daß der compiler bei der multiplikation des übergelaufenen zwischenergebnisses mit einer double-variablen brav nach double konvertiert.

    also immer schön überall .0 hinten dranhängen 😃



  • MS-VC++ beherrscht durchaus 64-bit-integers. die heißen da allerdings __int64.


Anmelden zum Antworten