Я поддерживаю программу, которая берет данные из PDP-11 (эмулированный!) программа и помещает его в современную систему на базе Windows. У нас есть проблемы с некоторыми значениями данных, о которых сообщают как "1.#QNAN" и также "1.#QNB". Клиент недавно показал, что 'плохие' значения в программе PDP-11 представлены 2 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);
}
---Alistair.
От эта страница , формат PDP-11 идентичен IEEE-754 формат с плавающей запятой за исключением того, что на экспоненту оказывают влияние 128 в PDP-11, тогда как на это оказывают влияние 127 в IEEE-754. Значит, нужно делить на 2,0, а не 4,0. Это не заботится о NaNs и бесконечностях, но из моих поисков в Google, похоже, у PDP-11 их не было.
У вас также возникнут проблемы с переполнением. Формат PDP переполняется раньше, но я предполагаю, что это нормально, поскольку вы не можете ничего сделать, если число уже переполнено.
PDP-11 использовал представление со смешанным порядком байтов для чисел с плавающей запятой. так что эта часть кода
uFloat.pdp11 = (input.word[0] << 16) + input.word[1];
верна, если ваши данные еще не были заменены местами до того, как вы их получите.
В этом документе приведены подробности представления множества различных форматов с плавающей запятой http://www.quadibloc.com/comp/cp0201.htm
В нем говорится, что PDP-11 / VAX использовали избыточное количество 128 обозначение экспоненты. тогда как IEEE 754 использует избыточную нотацию 126, поэтому, если она верна, деление на 4 кажется правильным способом регулировки степени.
Однако Википедия утверждает, что смещение экспоненты для IEEE 754 составляет 127, а не 126. Таким образом, либо в приведенном выше документе используется странная нотация, либо она неверна. Возможно, вам нужно разделить на 2, а не на 4.
Помимо NaN и Inf, у вас также могут возникнуть проблемы с преобразованием денормальных значений. Я не знаю, поддерживает ли их PDP-11, но IEEE 754 утверждает, что, когда поле экспоненты равно 0, тогда числа являются денормальными, что фактически означает, что подразумеваемая ведущая 1 в поле мантиссы становится 0. Таким образом, существует постепенная сходимость к 0 при уменьшении чисел.
@John - Стандарт IEEE 754 утверждает, что смещение экспоненты равно 127, а не 126. Wiki верна, а другая ссылка неверна. Таким образом, соотношение будет 2,0.