Feste type size unabhängig von der Plattform aus datei lesen
-
Huhu,
Ich lese aus einer Datei ein 32 bit großes float (IEEE 754 single). Wie float auf der Zielplattform implementiert ist, ist nicht bekannt. Wie geh ich am besten vor?
-
Wenn du das Format des
float
s der Datei kennst, kannst du es problemlos emulieren.
-
Ich erkläre mein Problem etwas genauer:
Das Format der Daten in der Datei ist bekannt.
Ich habe Variablen im Programm, über deren Format auf der Plattform ich nichts weiß.
Ich möchte die Daten in das Format der Plattform konvertieren, damit ich damit im Programm rechnen kann, nicht den Datentyp emulieren.
-
Azrael, il Meraz schrieb:
Ich erkläre mein Problem etwas genauer:
Aha, OK.
Du könntest den IEEE-Standard lesen und dann einen Konverter basteln.
-
Das Zielformat ist aber unbekannt...
Ich könnte natürlich die Zahl einfach aus dem Exponenten, Mantisse und Vorzeichen ausrechnen...
Oh... okay ich blamiere mich lieber nicht weiter
. Vielen Dank
-
Irgendwie bin ich doch nicht ganz zufrieden mit der Lösung.
So hab ich das gelöst (Eher C++ und läuft nur, wenn float == IEEE754 Single, tut aber nichts zur Sache
):
assert(sizeof(boost::uint32_t) == sizeof(float)); float srcfloat = -123.0f; boost::uint32_t ieee754single = *reinterpret_cast<boost::uint32_t*>(&srcfloat); float targetfloat; float signum = ((ieee754single & 0x80000000) ? (-1.0f) : 1.0f); float exponent = static_cast<float>((ieee754single >> 23) & 0xFF) - exp(log(2.0f)*7.0f) + 1.0f; float significand = 1.0f+static_cast<float>(0x007FFFFF & ieee754single)/exp(log(2.0f)*23.0f); targetfloat = signum * exp(log(2.0f)* exponent) * significand;
Bei den Daten, die ausgelesen werden, kann zwar mit Sicherheit davon ausgegangen werden, dass jedes float eine gültige Fließkommazahl ist, es stört mich trotzdem irgendwie, es "per Hand" machen zu müssen. Gibt es da keine andere andere Möglichkeit (außer jetzt die Berechnungen mit konstanten Zahlen durch Konstanten zu ersetzen :D)?.
Das Netz bringt mich hierhin: http://www.math.utah.edu/~beebe/software/ieee/, Das sieht aber für meine Zwecke nach Overkill aus