Fixpunktarithmetik aus float

Gast #3776901
Lesenswert?
• ▲
▼
Hallo!

Ich habe folgendes Problem, das vermutlich relativ schnell gelöst ist:

ich mach eine Temperaturmessung mit einem ADC (Spannungsteiler mit NTC), 
lies den SPannungswert ein und berechne mir daraus (mit vorwiderstand, 
B-Wert des NTC usw...) die Temperatur. DIe ganzen Berechnungen werden 
mit floats durchgeführt (der Prozessor verfügt über eine floating point 
einheit.

Nun will ich diese Temperatur, nennen wir sie float_temp, als 
fixpunktarithmetik mit einer Funktion auslesen. Die Temperatur geht von 
5°C bis 50°C, es gibt also keine negativen Werte. Ich will 2 
Kommastellen haben.

Mein Ansatz wäre, die float_temp zunächst mit 100 zu multiplizieren und 
dann mit einem cast zu einer 16-Bit-Integerzahl zu casten, also:

int_temp = (u_int32_t) (float_temp * 100);

Ist das korrekt oder hat es damit noch mehr auf sich?

lG
Gast #3777237
Lesenswert?
• ▲
▼
Ja OK, das meinte ich damit.

Wenn man es genauer machen will, müsste man schon vorher diese 
Fixpunktzahl einsetzen, dann wären alle Berechnungen auch mit int und 
nicht mit float. Aber nachdem der µC eine Floating Point Einheit 
besitzt, wird dies wohl nicht so schwer ins Gewicht fallen, schon gar 
nicht, wenn er mit 64MHz läuft. Ich benötige nur eine Schnittstelle 
(Funktion) nach extern, die mir diesen Wert in Fixpunktdarstellung 
liefert.

Danke, lG
Gast #3777288
Lesenswert?
• ▲
▼
eProfi schrieb:
> int_temp = (u_int32_t) (float_temp * 100)+0.5;

ok, wenn ich nun z.B. eine Temperatur von 23,47 °C habe, dann ist der 
Wert der Fixpunktzahl 2347. Durch die Addition der 0,5 wird die letzte 
Stelle, in diesem Fall also die 7, richtig sein. Richtig?

Ich nehme an, ich kann auch einen cast zu einem uint_16 machen?! Ich 
weiß, dass d float 32 Bit ist, aber ich benötige nur 16 Bit für die 
Darstellung...

Danke, lG
Gast #3777424
Lesenswert?
• ▲
▼
Werner13 schrieb:
> ok, wenn ich nun z.B. eine Temperatur von 23,47 °C habe, dann ist der
> Wert der Fixpunktzahl 2347.

In Float hast du aber keine 23,47, sondern es folgen weitere Stellen. 
Genau genommen hast du eine Rationale Zahl, bei der der Devisor eine 
glatte Zweierpotenz ist. Durch die Addition von 0,5 sorgst du dafür, das 
z.B. 23,465xxx zu 23,47 aufgerundet wird, aber 23,464xx zu 23,46 
abgerundet wird. Du halbierst damit also deinen maximalen Anzeigefehler 
- wenn man voraussetzt, dass deine Messungen so genau sind, wie du die 
Zahlen ausgibst ;-)

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.