tizian Geschrieben 9. April 2008 Teilen Geschrieben 9. April 2008 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; } Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
tizian Geschrieben 9. April 2008 Autor Teilen Geschrieben 9. April 2008 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 Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
tizian Geschrieben 9. April 2008 Autor Teilen Geschrieben 9. April 2008 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; } Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Klotzkopp Geschrieben 9. April 2008 Teilen Geschrieben 9. April 2008 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. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
tizian Geschrieben 9. April 2008 Autor Teilen Geschrieben 9. April 2008 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 Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Klotzkopp Geschrieben 9. April 2008 Teilen Geschrieben 9. April 2008 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. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Empfohlene Beiträge
Dein Kommentar
Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.