Hintergrund
Gibt es hier jemanden, der ein EE mit Programmiererfahrung ist und mit dem DSP der Texas Instruments TMS320 C3X-Serie gearbeitet hat? Ich arbeite gerade mit dem C3X für ein Projekt. Mein Ziel hier ist es, C3X-formatierte Gleitkomma- Hexadezimalwerte in das IEEE 754-Format zu konvertieren. Der Code, den ich habe, funktioniert ordnungsgemäß für:
Wobei x die eingegebene einzelne Gleitkomma-C3X-Hexadezimalzahl ist (dargestellt als UInt32).
Das Problem ist, wenn ich versuche, eine Zahl wie 0.123 zu verwenden . Es scheint, dass ich dadurch immer einen NaN- Wert bekomme . Ich verwende derzeit dieses Code-Snippet von der University of Florida , das ich auf C # portiert habe.
Verfahren
- Tauschen Sie die Vorzeichen- und Exponentenfelder aus, um von C3X zu IEEE zu wechseln. Ich werde diesen Code nicht anzeigen (sofern nicht gefragt), da ich glaube, dass er für jeden, der mit diesem DSP gearbeitet hat, sehr einfach ist.
- Führen Sie den Algorithmus der Universität von Florida (oben verlinkt) aus, den ich meines Erachtens nicht vollständig verstehe.
- Kombinieren Sie das Vorzeichen, den Exponenten und die Mantisse zu einem IEEE 754-Gleitkomma mit einfacher Genauigkeit.
C # -Implementierung
Hier ist der Code, der zum Implementieren des Algorithmus verwendet wird, wenn die C3X-Gleitkommazahl zufällig zwischen 0 und 1 liegt (wo das Problem auftritt). Das c30
Objekt repräsentiert die C3X-Gleitkommazahl. Das ieee
Objekt repräsentiert die IEEE 754-Gleitkommazahl.
BEARBEITEN: Auf vielfachen Wunsch finden Sie hier ein Codebeispiel, das nicht schrecklich ist. Dieses Beispiel ist die ordnungsgemäß funktionierende Version, in der wir 15.913,35 ... (als C3X hexadezimal) ausgeben.
C30Float c30 = null;
UInt32 bias = 127;
Int32 mantissa = 0;
Int32 digit = 0;
double fraction = 0;
double exponent = 0;
double fpValue = 0;
double sign = 0;
// 1. Declare the new C3X floating point value.
c30 = new C30Float(0x0D78A56B);
// 2. Get the sign bit value.
sign = c30.GetSign();
// 3. Decide whether or not to do the flip.
if (sign == 1)
{
// flip
mantissa = c30.GetMantissa();
mantissa = mantissa + 1;
mantissa = (~mantissa) & 0x007FFFFF; // the first 9 bits have nothing to do with the mantissa
}
else
{
mantissa = c30.GetMantissa();
}
// 4. Obtain part of the fraction (do the swim!).
for (int i = -1; i > -24; i--)
{
// mantissa index
int currentDigit = i + 23; // n = -23 + 23 => n = 0
// shift forward (get the digit)
digit = mantissa;
digit = digit & (1 << currentDigit);
// shift back (get the digit into the lowest place)
digit = digit >> currentDigit;
// apply the digit to the fraction
fraction += digit * Math.Pow(2, i);
}
// 5. Obtain the exponential part of the number.
exponent = c30.GetExponent() + 0x7F;
// 6. Get the floating point number.
fpValue = Math.Pow(-1, sign);
fpValue *= (1 + fraction) * Math.Pow(2, exponent - bias);
Ich weiß , dass ich nicht haben , um die Umsetzung zu den nachfolgend genannten Leitlinien:
GetMantissa()
GetExponent()
GetSign()
oder...
SetMantissa()
SetExponent()
SetSign()
Der Grund dafür ist, dass alles, was diese tun, darin besteht, die Nummern in die jeweiligen Felder einzugeben / daraus zu ziehen, wie im TMS320 C3X-Benutzerhandbuch angegeben . Wer weiß, vielleicht mache ich hier einen Fehler, aber jetzt möchte ich dort beginnen, wo ich denke, dass der Umfang des Problems beginnt. Wenn einer von Ihnen der Meinung ist, dass das Problem nicht vorliegt, können Sie sich gerne nach dieser Implementierung erkundigen, und ich werde Ihnen bei Bedarf weitere Einzelheiten mitteilen.
Frage
Mein Problem liegt anscheinend bei Zahlen zwischen 0 und 1. Wenn also jemand C3X-Hex-Werte und deren bekannte Gegenstück-Floats / Reals kennt, die ich einstecken und tuckern kann, wäre das großartig, damit ich diesen Algorithmus beheben kann.
Hinweis: Wir haben den DSP nicht vor uns für das, was wir tun, und können nicht einfach die Zahlen herausholen.