Probleme bei Rechenoperation in C

Hallo C-Experten!

Ich habe ein Problem mit der folgenden Rechenoperationen in C:

Ich habe ein Programm geschrieben, bei welchem man einen Satz eigeben kann, dessen Länge und die Anzahl eines bestimmten Buchstaben das Programm dann bestimmt.
Danach will ich den prozentualen Anteil dieses einen Buchstaben an der Gesamtlänge bestimmen.
Dazu habe ich folgende Operation:

prozent=(anzahl/laenge)*100.0;

Wenn ich nun das Programm ausführe, bestimmt er die Länge des Satzes und die Anzahl der Buchstaben richtig, nur für prozent zeigt er immer 0.00 an.

Ändere ich jetzt die Rechenoperation in:

prozent=100.0/laenge*anzahl;

um, zeigt er prozent richtig an.

Wie kann es denn sein, dass er einmal ein richtiges und einmal ein falsches Ergebnis anzeigt, obwohl (meiner Meinung nach) beide Operationen identisch sind?
Wer weiter weiss, soll es mich bitte wissen lassen.

Vielen Dank!
Timo

Hi Timo!

Ich gehe davon aus, daß Du für Anzahl und Länge jeweils ganzzahlige Typen (int, besser long) verwendest. Die ganzzahlige Division von z.B. 13 durch 65 ergibt aber immer 0. Daß das dann noch auf einen Fließkommawert konvertiert wird um es mit 100.0 (man beachte das .0 , sonst würde auch diese Konvertierung nicht stattfinden) zu multiplizieren hilft Dir also auch nicht mehr weiter.
Anders bei Deinem zweiten Ansatz: Da wird ein Fließkommawert durch einen ganzzahligen Wert dividiert, daher gibts auch ein Fließkommaergebnis, das dann auch noch richtig mit dem (in einen Fließkommawert umgewandelten) zweiten Faktor multipliziert wird.

Man kann das natürlich auch durch type casts umgehen (hier mit doubles, geht natürlich auch mit float):

prozent=((double)anzahl/(double)laenge)\*100.0;

Gruß,
TheBeast

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

Hallo Timo

prozent=(anzahl/laenge)*100.0;

Ich gehe mal davon aus, das die beiden Variablen „anzahl“ und „laenge“ int-Variablen sind.

Wenn ich nun das Programm ausführe, bestimmt er die Länge des
Satzes und die Anzahl der Buchstaben richtig, nur für prozent
zeigt er immer 0.00 an.

Das ist richtig. Bei der Division zweier int-Werte kommt als Ergebnis wieder ein int raus. Nachkommastellen werden abgeschnitten. Da du bei deiner Rechnung vermutlich immer Werte

Hi,

das ist ganz einfach. Deine Werte ‚anzahl‘ und ‚laenge‘ sind ja sicher als ganzzahl deklariert. Wenn Du nun eine Division mit den beiden werten durchführst, wird alles, was hinter dem Komma ist abgeschnitten. Und da der Wert ja kleiner als 0 ist bleibt bloß noch 0 übrig. Bei Deinem zweiten Ansatz rechnest du ja gleich mit dem float 100,0. Da kommt dann als Lösung ein float raus, und mit dem rechnest Du dann weiter. Dein erstes Beispiel funktioniert, wenn Du einen Wert in einen Float explizit umwandelst.

prozent = (float)anzahl/laenge*100.0

so wird es dann auch gehen.

grüße Micha

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

Hallo Timo,

prozent=(anzahl/laenge)*100.0;

Wenn ich nun das Programm ausführe, bestimmt er die Länge des
Satzes und die Anzahl der Buchstaben richtig, nur für prozent
zeigt er immer 0.00 an.

Wie schon gesagt liegt das Problen an der Integerdivision.
Beispiel:
Anzahl = 20
Länge = 40

anzahl/länge = 0.5 --> 0 !
0*100 = 0

Wenn du aber die Formel umstellst, funktioniert es auch mit Integer:
prozent=(anzahl*100)/laenge;

somit ergibt sich:
anzahl*100 = 2000
2000/40 = 50

MfG Peter(TOO)

Wenn du aber die Formel umstellst, funktioniert es auch mit
Integer:
prozent=(anzahl*100)/laenge;

somit ergibt sich:
anzahl*100 = 2000
2000/40 = 50

MfG Peter(TOO)

Hi Peter,

Das sehe ich nicht ganz so, weil eventuelle Nachkommastellen abgeschnitten werden und nicht gerundet wird:
anzahl=9
laenge=1000
ergibt bei Dir 0 %, sind aber eigentlich 0,9 %, also würde ich wohl wenigstens 1 % haben wollen (wenn schon ohne Nachkomma).

Gruß,
TheBeast

Hallo TheBeast,

Das sehe ich nicht ganz so, weil eventuelle Nachkommastellen
abgeschnitten werden und nicht gerundet wird:
anzahl=9
laenge=1000
ergibt bei Dir 0 %, sind aber eigentlich 0,9 %, also würde ich
wohl wenigstens 1 % haben wollen (wenn schon ohne Nachkomma).

Das ist halt immer eine Frage der Anforderungen. Auf einem PC spielt es heute keine grosse Rolle ob du mit Integer oder FloatingPoint rechnest, da ja heute die FPU mit auf der CPU integriert ist.

Wenn du dich aber mit Micro-Controllern beschäftigst sieht das ganze etwas anders aus !

Das grundsätzliche Problem liegt aber darin, dass man sich beim Programmieren auch mit den Datentypen Integer und PloatingPoint auseinandersetzen sollte und erst dann grosse Programme erstellen sollte!
Die Grundlagen muss halt jeder einaml lernen.

MfG Peter(TOO)