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
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
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
> 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