Rechnung mit Float (GCC)

Gast #336009
Lesenswert?
• ▲
▼
Einen guten Abend,

ich versuche die genaue Temperatur mit einem ds1621 zu ermitteln.
Dazu nutze ich die Formel
temp = data[0] - (1/4) + (slope[0]-counter[0])/(slope[0]);

temp ist vorher als float definiert worden und data[0],slope[0] und
counter[0] haben ganzzahlige Werte.
Dennoch kommt bei der Ausgabe durch sprintf(text,"%f",temp);
und anschließender Übermittelung über UART an den Rechner auf dem
Terminal nur ein '?' an.
Verwende ich sprintf(text,"%d",temp); erhalte ich statt einem '?'
eine 0, in keinem Fall aber den richtigen Wert.
Was mache ich falsch? Wie berechne und übermittle ich solche
Fließkommazahlen?

Gruß Christian
Gast #336012
Lesenswert?
• ▲
▼
> temp = data[0] - (1/4) + (slope[0]-counter[0])/(slope[0]);

Zum einem sind da unnötige Klammern drin, zum anderem musst Du eben mit
float rechnen. ;-)

 temp = data[0] - 1.0/4 + (float)(slope[0]-counter[0]) / slope[0];

Immer daran denken: "Punktrechnung vor Strichrechnung" Das gilt auch
für den Compiler.

Der Compiler rechnet immer dann in float, wenn eine Seite der Rechnung
schon in float ist. Aber der Compiler macht auch Punkt-vor-Strich.

D.h. wenn du "1/4" schreibst, macht er eine Integerdivision, bei der
kommt immer 0 raus. Also musst Du "1.0/4" schreiben.

So, das war die erste Teilrechnung, die nach dem Motto "Punkt vor
Strich" vom Compiler durchgeführt wurde.

Nun muss der Compiler "(slope[0]-counter[0])" ausrechnen. Das sind
beides Integerwerte, das kann er also mit Integer machen. Das ist
korrekt.

Dann wird das vorherige Ergebnis durch "slope[0]" geteilt.
"slope[0]" ist aber ein Integer, und der Compiler würde hier also
wieder eine Integer-Rechnung machen. Also musst Du von Hand eine
Argument der Division in float wandeln. Darum das "(float)" vor dem
Klammerausdruck  "(slope[0]-counter[0])". Dadurch wird das Ergebnis
der Integersubtraktion in ein Float gewandelt und anschließend als
float durch slope[0] geteilt.

Zum Schluss hat der Compiler noch ein Interger minus ein Float plus ein
Float zu rechnen. Da mindestes ein Argument ein Float ist, wandelt er
den Integer "data[0]" selber in ein Float um.

Das war's! ;-)

Antwort schreiben

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.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.