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

Eine eigene Frage? Dieser Thread ist über 20 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

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.