Я поддерживаю программу, которая берет данные из программы PDP-11 (emulated!) и помещает ее в современную систему на базе Windows. У нас возникают проблемы с сообщением некоторых значений данных как "1. # QNAN", а также "1. # QNB". Недавно клиент обнаружил, что "плохие" значения в программе PDP-11 представлены двумя 16-битными словами со всеми битами, кроме первого. Я думаю, что когда мы пытаемся преобразовать их в поплавки IEEE, мы получаем ошибки.
Я нашел приведенный ниже код, который используется для преобразования значений PDP-11 в IEEE. Я не очень хорошо разбираюсь в тонкостях представлений с плавающей точкой, но для меня это немного просто! Будет ли это действительно надежно конвертировать PDP-11 в 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);
}
--- Алистер.