Forum: Mikrocontroller und Digitale Elektronik float in uint8_t mit dem GCC


von Matthias (Gast)


Lesenswert?

Hallo.

Wenn ich eine float Variable mit dem AVR Studio in ein uint8_t caste und 
dann zu einer uint8_t Variable zuweise, ist das soweit okay?
Runden muß nicht zwingend passen - Die Kommastellen brauche ich an einer 
anderen Position.

float calc_wert;
uint8_t reglerwert;
reglerwert = (uint8_t)calc_wert;

Grüße!

von majormoritz (Gast)


Lesenswert?

Die Nachkommastellen werden aber nur abgeschnitten. Evtl. Zum runden 
+0.5.

Moritz

von Achim M. (minifloat)


Lesenswert?

Matthias schrieb:
> Die Kommastellen brauche ich an einer
> anderen Position.

wieviele Kommastellen? schon mal daran gedacht, Festkommaarithmetik zu 
verwenden?

von Matthias (Gast)


Lesenswert?

@majormoritz: Stimmt. Das könnte ich noch nutzen.

@Joachim K.: Zwei Nachkommastellen würden reichen. Ja, auf Festkomma 
kann ich noch umstellen - das wäre auch einiges flotter.

Aber grundsätzlich würde es okay sein mit dem einfachen casten oder?

von Achim M. (minifloat)


Lesenswert?

Ja, ist sogar besser als impliziter cast. Den schluckt der Compiler u.U. 
ohne irgendwas anzumeckern und wenn irgendwas dann komisch oder falsch 
funktioniert, man hat mal wieder einen Fehler, der schwer zu finden ist.
Für geeigneten Zahlenbereich musst natürlich du sorgen :)

PS: C++ hat da zwei verschiedene casts: Typkonversion oder einfach 
Bitmuster umfüllen. Letzteres bekommt man in C z.B. mit einer Union. 
Damit wirds dann auch maschinenabhängig...

: Bearbeitet durch User
von Josef D. (jogedua)


Lesenswert?

Joachim K. schrieb:
> Ja, ist sogar besser als impliziter cast.

Halte ich für eine gewagte These.
Wenn schon, dann besser so:
reglerwert = (typeof(reglerwert))calc_wert;

Sonst bleibt der cast vielleicht versehentlich so stehen, wenn man den 
Typ von reglerwert ändert.

: Bearbeitet durch User
von Achim M. (minifloat)


Lesenswert?

Josef D. schrieb:
> Halte ich für eine gewagte These.

Ich auch. calc_wert soll doch später mal ein int werden, nicht der 
Reglerwert...

Die beste Methode wäre an der Stelle einen Kommentar zu setzen, dass da 
ein TODO ist, um das man sich bei Festkommaarithmetik kümmern muss. 
Auch, um vielleicht festzustellen, dass rein garnichts zu tun ist :D

von Matthias (Gast)


Lesenswert?

(typeof(reglerwert)) ist cool :)
Das muß ich mir mal angewöhnen.

Warum ich aber fragte, ich mache AD-Wandlungen und bekomme im Startmodi 
plötzlich und unerwartet statt einem 1023er ADCw eine 532 raus.
OBWOHL im ADC-Register nach dem 532 schreiben eine 1023 drin steht.
Wenn ich aber die Zeile mit dem casting lösche, der natürlich in einem 
ganz anderen ADC-Kanal steht, funktioniert alles tadellos.

Wenn ich z.B. schreibe:
1
ADCwert = ADC;
2
if(ADCwert == 532)
3
{
4
ADCwert = ADC;
5
}

Und mache ein Brekpoint auf den inneren "=ADC", dann kann ich mit 
Einzelstep plötzlich den falsch gezogenen 532 Wert mit 1023 ersetzen.
Im freien Lauf funktioniert das aber nicht.

Ich komme dem blöden Fehler einfach nicht hinterher :(

Überschreiben von Variablen im Mamory habe ich schon gecheckt.
Vorne und hinten dran rührt sich nichts wenn die 532 plötzlich in der 
Variable steht...

von Dr. Sommer (Gast)


Lesenswert?

Matthias schrieb:
> (typeof(reglerwert)) ist cool :)
> Das muß ich mir mal angewöhnen.

Das ist aber eine Nonstandard-Erweiterung vom GCC. Besser ist "decltype" 
das seit C++11 Standard ist.

Joachim K. schrieb:
> Bitmuster umfüllen. Letzteres bekommt man in C z.B. mit einer Union.
Oder durch einen Pointer-Cast:
1
*((uint8_t*) &myFloat)
In C++ dann schöner mit:
1
reinterpret_cast<uint8_t&>(myFloat)

von Karl H. (kbuchegg)


Lesenswert?

Matthias schrieb:
.
> Wenn ich aber die Zeile mit dem casting lösche, der natürlich in einem
> ganz anderen ADC-Kanal steht, funktioniert alles tadellos.

Zeig mal den Code.
Mit dem Cast an sich hat das nichts zu tun. Da läuft irgendwas anderes 
falsch.

von Matthias (Gast)


Lesenswert?

Hallo.

Bin immer noch an der Sache dran obwohl ich heute Urkaub hätte und jetzt 
schon wieder viiiieeel zu spät ist.
Ich habe es nun im neuesten Atmel Studio integriert und der Fehler ist 
weg.
Kann Euch den Code leider nicht hoch laden, da es ein Firmenprojekt mit 
einigen tausend Zeilen ist.
Dann kann ich meinen Urlaub auch gleich verlängern ;)

Habe jetzt schon drei Stunden die Zeile gesucht und versucht dem Ganzen 
aus dem Weg zu gehen.
Mehr Zeit kann ich nicht mehr daran hängen, sorry.

Auf jeden Fall gehts im aktuellen Studio.

Danke!

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.