char bzw. void in float umwandeln
-
7H3 N4C3R schrieb:
Apollon schrieb:
Spinnt ihr?
Nö.
Ja, es gibt eine IEEE-Standardisierung für die Darstellung von float. Nein, sie ist nicht vorgeschrieben im C++-Standard. Selbst in IEEE-Darstellung bleibt das Endianess-Problem.
Natuerlich legt C++ die Darstellung von Zahlen nicht fest. Diese ist durch die Hardware schon festgelegt. Auf meiner Maschine ist es die IEEE-754 Darstellung in LE Kodiert. Das Endianess-Problem ist kein Problem, wenn er in die Dokumentation des Hardwareherstellers eine Blick wirft, dann weiss er, wie die Daten zu interpretieren sind.
-
float leFloat(uchar a, uchar b, uchar c, uchar d) { return a | (b << 8) | (c << 16) | (d << 24); }Das liefert eine Zahl zwischen 0 und ca. 4 Mio. die in keinem (sinnvollen) Zusammenhang zur Ursprungszahl steht.
@Blubbfisch:
Schau in die Doku des Hardware-Herstellers, wie der Float aufgebaut ist.Dann kannst du den entweder über Standard-C++ in einen float übertragen (indem man sich jede Stelle anschaut und draufaddiert) oder du weißt, wie float auf deiner Plattform, auf der das Programm läuft, dargestellt wird und reinterpretierst die Daten direkt auf Hardware-Ebene.
-
7H3 N4C3R schrieb:
@Blubbfisch:
Schau in die Doku des Hardware-Herstellers, wie der Float aufgebaut ist.Dann kannst du den entweder über Standard-C++ in einen float übertragen (indem man sich jede Stelle anschaut und draufaddiert) oder du weißt, wie float auf deiner Plattform, auf der das Programm läuft, dargestellt wird und reinterpretierst die Daten direkt auf Hardware-Ebene.
Bis jetzt noch garnet, da ich den µC am anderen Ende der USB-Strippe auch noch programmieren muss. Hab nur die Funktionen für die Datenübertragung von Atmel übernommen. Werde das schon so hinbiegen, dass es passt.

-
probiers doch mal per stringstream also erst in eine string und dann in eine andere var...
-
Apollon schrieb:
Natuerlich legt C++ die Darstellung von Zahlen nicht fest. Diese ist durch die Hardware schon festgelegt. Auf meiner Maschine ist es die IEEE-754 Darstellung in LE Kodiert. Das Endianess-Problem ist kein Problem, wenn er in die Dokumentation des Hardwareherstellers eine Blick wirft, dann weiss er, wie die Daten zu interpretieren sind.
Also könnte man z.B. nicht bei einer Netzerkandwendung float Werte fehlerfrei übertragen???
mfg.
-
joomoo schrieb:
Also könnte man z.B. nicht bei einer Netzerkandwendung float Werte fehlerfrei übertragen???
Im Textformat wäre sichlich nicht performant, aber (abzüglich der Fehler, die durch die Konvertierung ins Dezimalsystem entstehen) korrekt und plattformunabhängig.
-
joomoo schrieb:
Apollon schrieb:
Natuerlich legt C++ die Darstellung von Zahlen nicht fest. Diese ist durch die Hardware schon festgelegt. Auf meiner Maschine ist es die IEEE-754 Darstellung in LE Kodiert. Das Endianess-Problem ist kein Problem, wenn er in die Dokumentation des Hardwareherstellers eine Blick wirft, dann weiss er, wie die Daten zu interpretieren sind.
Also könnte man z.B. nicht bei einer Netzerkandwendung float Werte fehlerfrei übertragen???
mfg.
Du uebertraegst keine Floats, Ints, etc. sondern Bitmuster. Wie der Empfaenger sie interpretiert ist ihm ueberlassen.
-
was mich eigentlich wundert ist.
nach standard darf manchar buf[sizeof(float)]; float hans=1.125f; memcpy(buf,&hans,sizeof(float));und auch zurück
das impliziert doch eigentlich dastemplate <typename T> union fred { T val; char chars[sizeof(T)]; };dass auch passen sollte
-
b7f7 schrieb:
was mich eigentlich wundert ist.
nach standard darf man
...
und auch zurück
das impliziert doch eigentlich das
...
dass auch passen sollteWenn du beide Datentypen in eine Union legst, stellst du (oder besser gesagt der Compiler) sicher, dass sie auch ein kompatibles Alignment bekommen. Damit funktioniert dann auch ein "Union Cast" (mal davon abgesehen, dass man laut Standard eigentlich nur auf das zuletzt zugewiesene Element einer Union zugreifen darf).
Hat man dagegen beide Datentypen getrennt definiert, so kann der Compiler garnicht wissen, dass ein kompatibles Alignment nötig ist. Folgendes Beispiel crasht mit sehr hoher Wahrscheinlichkeit:
char test[] = "ABCDEFGHIJKL"; float f; char* iter = test; for( int i = 0; i < 8; ++i, ++iter) { f = *(reinterpret_cast<float*>( iter)); }
-
Unions darf man nicht zum casten verwenden, steht ausdrücklich im Standard.
Schaut euch doch mal an wieviele Protokolle auf Textbasis sind, hat schon seinen Grund.