Ich führe ein Programm, das Daten von einem PDP-11 (emuliert!) Programm nimmt und es in ein modernes Windows-basiertes System bringt. Wir haben Probleme mit einigen Datenwerten, die als "1. # QNAN" und auch als "1. # QNB" gemeldet werden. Der Kunde hat kürzlich offenbart, dass "schlechte" Werte im PDP-11-Programm durch 2 16-Bit-Wörter mit allen gesetzten Bits außer dem ersten dargestellt werden. Ich glaube, wenn wir versuchen, diese in IEEE-Floats umzuwandeln, bekommen wir die Fehler.Wird dieses C++ PDP-11 zu IEEE?
Ich habe den folgenden Code gefunden, der für die Konvertierung der PDP-11-Werte in IEEE verwendet wird. Ich bin nicht sehr in Kontakt mit den Feinheiten von Gleitkommadarstellungen, aber das scheint mir ein bisschen einfach zu sein! Würde das PDP-11 wirklich zuverlässig in IEEE konvertieren?
// ---------------------------------------------------------------- cnvPDPfloat
// CNVPDPFLOAT
// ----------------------------------------------------------------------------
//
// Converts PDP11 float (two 16-bit words) into IEEE float
//
// PDP11 and IEEE floats have same layout so can be mapped onto eachother.
// But PDP11 exponent must have 2 subtracted for IEEE. Or just divide by 4.
//
float cnvPDPfloat(PDP11Float input)
{
union
{
unsigned long pdp11;
float ieee;
} uFloat;
uFloat.pdp11 = (input.word[0] << 16) + input.word[1];
return (uFloat.ieee/(float) 4.0);
}
--- Alistair.
+1 einfach für die Tatsache ist, dass Sie pdp-11-Code zu erhalten. –
Beachten Sie, dass '1. # QNB' einfach" 1. # QNAN' "auf" 4 "gerundet ist. (Ich kann die vorherige SO-Frage über den häufigeren Fall von "# INF", der zu "# J" gerundet wird, nicht finden.) –