Zum Inhalt springen
View in the app

A better way to browse. Learn more.

Fachinformatiker.de

A full-screen app on your home screen with push notifications, badges and more.

To install this app on iOS and iPadOS
  1. Tap the Share icon in Safari
  2. Scroll the menu and tap Add to Home Screen.
  3. Tap Add in the top-right corner.
To install this app on Android
  1. Tap the 3-dot menu (⋮) in the top-right corner of the browser.
  2. Tap Add to Home screen or Install app.
  3. Confirm by tapping Install.

Falsches Ergebnis bei einer Rechenoperation

Empfohlene Antworten

Veröffentlicht

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;

}

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

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;

}

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.

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

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.

Configure browser push notifications

Chrome (Android)
  1. Tap the lock icon next to the address bar.
  2. Tap Permissions → Notifications.
  3. Adjust your preference.
Chrome (Desktop)
  1. Click the padlock icon in the address bar.
  2. Select Site settings.
  3. Find Notifications and adjust your preference.