www.mikrocontroller.net

Forum: Compiler & IDEs Rechnen mit float


Autor: anton (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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");

Autor: anton (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
...wobei das Initaliesieren in der erste  zeile natürlich keine Rolle
spielt

Autor: Peter Dannegger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Was ist "Periode" ?

Du must schon alles relevantes posten !



Peter

Autor: Daniel (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: anton (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ja periode ist natürlich falsch, da soll myf stehen

Autor: anton (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
danke erstmal,

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

Autor: Daniel (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: anton (Gast)
Datum:

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

Autor: anton (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
es funktioniert!!! ;))

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.