Forum: Compiler & IDEs Rechnen mit float


von anton (Gast)


Lesenswert?

Hallo,

kann mir jemand sagen warum das folgende Beispiel mit meinem Mega16
nicht funktioniert? Und zwar als Ergebnis wird eine Null ausgegeben.

  float myf=0.005;
  uint8_t buf[20];

  myf = 10/50;
  dtostre (Periode, buf, 5, 0);
  uart_puts(buf);
  uart_puts("\n");

von anton (Gast)


Lesenswert?

...wobei das Initaliesieren in der erste  zeile natürlich keine Rolle
spielt

von Peter Dannegger (Gast)


Lesenswert?

Was ist "Periode" ?

Du must schon alles relevantes posten !



Peter

von Daniel (Gast)


Lesenswert?

Hallo Anton, Peter,

in diesem Fall ist der Schuldige schon gefunden (meiner Meinung nach)
myf = 10/50;
ergibt 0 (Null), da hier eine Ganzzahldivision durchgeführt wird. Da
ist dann natürlich 10 durch 50 gleich Null. Wenn man eine
Float-Division durchführen möchte, dann am besten mit : my = 10.0/50.0;
(myf = 10/50.0;  reicht auch).

Allgemein : Wenn bei einer Division der Nenner ganzzahlig ist, dann
wird automatisch eine Ganzzahldivision durchgeführt. Wenn man sicher
gehen will, dass auch eine Gleitkommadivsion durchgeführt wird, dann
muss man im Nenner einen Gleitkommawert verwenden (bzw. durch einen
Cast das gleiche Verhalten erzeugen).
Peter möge mich korrigieren, wenn ich falsch liege ;-).

MfG, Daniel.

von anton (Gast)


Lesenswert?

ja periode ist natürlich falsch, da soll myf stehen

von anton (Gast)


Lesenswert?

danke erstmal,

das heisst, wenn ich zwei integer-Variablen durcheinander dividieren
will, muss ich die im Nenner stehende Varaible erstmal in float
konvertieren?

von Daniel (Gast)


Lesenswert?

Hallo Anton,

wenn Du wirklich dann ein Ergebnis mit Kommastellen haben möchtest,
lautet die Antwort ja.
Beispiel :

int iA=6, iB=4;
float fErg = iA / ((float)iB);

fErg hat nun den Wert 1.5

Wenn Dich aber nur der ganzzahlige Teil der Rechnung interessiert, dann
brauchst Du keine Typumwandlung (Cast).

Beispiel :
int iA=6, iB=4;
int   iErg = iA / iB;
float fErg = iA / iB;

in iErg steht nun 1, in fErg 1.0
Meistens verwendet man keine float-Variable um ganmzzahlige Werte zu
speichern - das wäre Verschwendung von Rechenzeit und Speicherplatz.
Außerdem kann das zu Mißverständnissen beim Lesen des Codes führen.

Immer nach dem Motto arbeiten : "Das Programm schreibt man für den
Menschen - der Code für den Prozessor macht dann der Compiler !"

MfG, Daniel.

von anton (Gast)


Lesenswert?

danke Daniel für die ausführliche Beschreibung,
ich werde es heute ausprobieren.

von anton (Gast)


Lesenswert?

es funktioniert!!! ;))

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.