Sto mantenendo un programma che prende i dati da un programma PDP-11 (emulato!) E lo inserisce in un moderno sistema basato su Windows. Stiamo riscontrando problemi con alcuni dei valori dei dati riportati come "1. # QNAN" e anche "1. # QNB". Il cliente ha recentemente rivelato che i valori "cattivi" nel programma PDP-11 sono rappresentati da 2 parole a 16 bit con tutti i bit impostati tranne il primo. Penso che sia quando proviamo a convertirli in float IEEE che stiamo ricevendo gli errori.Questo C++ convertirà PDP-11 in IEEE?
Ho trovato il codice seguente che viene utilizzato per convertire i valori PDP-11 in IEEE. Non sono molto in contatto con la complessità delle rappresentazioni in virgola mobile ma questo mi sembra un po 'semplice! Sarebbe davvero in grado di convertire in modo affidabile i float PDP-11 in IEEE?
// ---------------------------------------------------------------- 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 semplicemente per il fatto che si deve mantenere il codice PDP-11. –
Si noti che '1. # QNB' è semplicemente' 1. # QNAN' "arrotondato" a 4 posizioni. (Non riesco a trovare la domanda SO precedente sul caso più comune di "# INF" che è "arrotondato" a "# J".) –