Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

UINT Bitmuster interpretieren als float Wert

27 views
Skip to first unread message

Michael Burkhardt

unread,
Jul 23, 2009, 5:52:02 AM7/23/09
to
Hallo, ich such in C# eine Möglichkeit einen UINT32 Wert nämlich 1095890894
als Bitmuster für einen Floatwert zu interpretieren sodas der Wert 13,123 als
Float herauskommt (Dieser Wert ist richtig interpretiert).
In cpp .NET mache ich das so: return (*(float*)&fWert);

Das reine Casten dieses Wertes in c# ergibt volgenden Float Inhalt
1,095890894+E9.
Was muss ich tun um die 13,123 zu bekommen?

Vielen Dank im Voraus!
Gruß Michael

Elmar Boye

unread,
Jul 23, 2009, 6:11:46 AM7/23/09
to

Hallo Michael,

Michael Burkhardt schrieb:

Via BitConverter Klasse
<URL:http://msdn.microsoft.com/de-de/library/system.bitconverter.aspx>

uint input = 1095890894;

Console.WriteLine("{0} => {1}",
input,
BitConverter.ToSingle(BitConverter.GetBytes(input), 0));

Gruß Elmar

Peter Fleischer

unread,
Jul 23, 2009, 7:55:23 AM7/23/09
to
"Michael Burkhardt" <MichaelB...@discussions.microsoft.com> schrieb im
Newsbeitrag news:250E0094-D203-48F4...@microsoft.com...

Hi Michael,
deine Festkommazahl 1095890894 ergibt binär keine Gleitkommazahl 13,123,
wenn deine UInt als Mantisse genutzt wird (egal ob mit oder ohne MSB). Da
muss es also einen Umrechnungsalgorithmus geben, denn bestimmt nur du
kennst.

--
Viele Grüsse
Peter

Frank Dzaebel

unread,
Jul 23, 2009, 2:11:21 PM7/23/09
to
Hallo Michael,

> Hallo, ich such in C# eine Möglichkeit einen UINT32 Wert nämlich
> 1095890894 als Bitmuster für einen Floatwert zu interpretieren sodas
> der Wert 13,123 als Float herauskommt (Dieser Wert ist richtig
> interpretiert).

Nun, der Cast, den Du meinst, ist unsauber über
die Byte-Ebene im C++ Stil überlagert. In C#
versucht man möglichst nur über den getypten
Weg zu gehen und mit OOP zu arbeiten, sonst
können z.T. Werte entstehen, die gar nicht mehr
zum Typ gehören, etc.. Typsicherheit steht in C# weit vorne.

Nun, es gibt viele Möglichkeiten. Wenn Du wirklich
weisst, was Du tust, ist folgendes am performantesten:

private void Form1_Load(object sender, EventArgs e)
{
uint ui = 1095890894;
float ff = UIntToFloat(ui);
bool ok = (ff - 13.123f) < float.Epsilon;
}

public unsafe float UIntToFloat(uint ui)
{
// deutlich schneller, als etwa "BitConverter.ToSingle"
return *((float*)(void*)&ui);
}
_____________________

oder:

// langsamer, aber sicherer:
float f2 = BitConverter.ToSingle(BitConverter.GetBytes(ui), 0);
_____________________

Solche unsauberen Castings wie oben sind in C# aber
normalerweise vermeidbar und man benötigt normal keine
solchen Byte-Casts. Ggf. schildere Deinen Kontext bzw. die
Anforderungen (speziell Performance), dann können ggf.
bessere Vorschläge zur best practice in solchen Fällen
gegeben werden. Unsafe wird normal vermieden, aber wenn
Du es in eine unsafe DLL auslagerst, kann das in bestimmten
Anforderungs-Szenarien ok sein.


ciao Frank
--
Dipl.Inf. Frank Dzaebel [MCP/MVP C#]
http://Dzaebel.NET

0 new messages