Veröffentlicht 9. April 200817 j Moin, Beim c-lernen bin ich mal wieder auf ein Problem gestoßen: Ich soll ein Problem mit bestimmten rechenoperationen schreiben, und für manche Ausdrücke bei manchen Werten bekomme ich falsche Ergebnisse. Vermutlich liegt der Fehler in Konvertierungsverlusten bei bei bestimmten Datentypen, aber ich finde in meinem Code keinen Fehler. Vielleicht kann sich ja mal jemand mein Beispiel ansehen und mir sagen wo mein Fehler ist. Danke! Im entsprechenden Beispiel sollte als ergebnis 4.84e-2 herauskommen, aber seht selbst! MfG Tizian -------------------------------------------------------------------------- -------------------------------------------------------------------------- #include<stdlib.h> #include<stdio.h> #include<math.h> int main(void) { double PI = 3.14159265358979323846; int n, m; double x, y, expr1, expr2, expr3, expr4, u31; n=10; m=-20; x=5.5; y=0.8; u31 = (pow(x,4) + pow(y,4))/4; expr3 = (1/( u31 +2))*(log(u31 +1)); printf("Ausdruck 3 ist: %16.15e\n", expr3); system("pause"); return 0; }
9. April 200817 j Moin, Habe den Fehler entdeckt! Hab in der Rechnung einmal ausversehen eine Variable mit einer Konstante vertauscht. So hat der Term für manche Rechnungen gepasst und für manche nicht... Ciao Tizian
9. April 200817 j Moin, Ich bins wieder. Hab mein erstes Problem ja gelöst, hab dafür aber ein neues :-/ Ich bekomme die Ausgabe langer Zahlen nicht hin! im Programm scheinen sie korrekt verwendet zu werden, denn das Endergebnis stimmt. Aber die Darstellung des Zwischenergebnisses funktioniert nicht so wie geplant. Warum bekomme ich bei der Ausgabe von m und n via %le, %e, %d und bei k via %ld falsche Anzeigen auf dem Schirm? Wo ist der Fehler? Danke --------------------------------------------------------------------------- --------------------------------------------------------------------------- #include<stdlib.h> #include<stdio.h> #include<math.h> int main(void) { long long n,m; long long k; n=2000000000; m=1000000000; printf("n = %le\n",n); printf("n = %ld\n",n); printf("m = %le\n",m); printf("m = %ld\n",m); printf("n+m = %le\n",(long long)(n+m)); printf("n+m = %ld\n",(long long)(n+m)); k = (n+m); printf("k = %ld\n",k); system("pause"); return 0; }
9. April 200817 j Warum bekomme ich bei der Ausgabe von m und n via %le, %e, %d und bei k via %ld falsche Anzeigen auf dem Schirm?Weil keines dieser Formate auf long long int passt. Siehe dazu auch die Dokumentation von printf. Benutz %ll, gefolgt von d, i, o, u, x oder X. e und le sind für double bzw. long double vorgesehen. Du solltest übrigens auch auf deine Literale achten. Wenn du keine weitere Kennzeichnung angibst, werden sie als int interpretiert. Kennzeichne long long-Literale mit ll am Ende. Der Cast der Summe auf long long ist unnötig.
9. April 200817 j Weil keines dieser Formate auf long long int passt. Siehe dazu auch die Dokumentation von printf. Benutz %ll, gefolgt von d, i, o, u, x oder X. e und le sind für double bzw. long double vorgesehen. Ah ja. Mit lld funktioniert das jetzt. In meinem Skript stand dazu leider nichts. Du solltest übrigens auch auf deine Literale achten. Wenn du keine weitere Kennzeichnung angibst, werden sie als int interpretiert. Kennzeichne long long-Literale mit ll am Ende. Hat bei mir auch ohne Kennzeichnung der Literale funktioniert. Lag das daran, das ich die Variablen vorher schon als long long initiiert habe? Der Cast der Summe auf long long ist unnötig. Das ist irgendwann mal auf der Fehlersuche passiert... Ciao tizian
9. April 200817 j Hat bei mir auch ohne Kennzeichnung der Literale funktioniert. Lag das daran, das ich die Variablen vorher schon als long long initiiert habe?Nein, das liegt daran, dass deine Literale so gerade eben noch in den Wertebereich eines 32Bit signed int passen. Bei 2.147.483.647 ist Schluss.
Archiv
Dieses Thema wurde archiviert und kann nicht mehr beantwortet werden.