Этот C++ преобразует плавания PDP-11 в IEEE?

Я поддерживаю программу, которая берет данные из 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.

10
задан user41013 12 February 2010 в 09:07
поделиться

3 ответа

От эта страница , формат PDP-11 идентичен IEEE-754 формат с плавающей запятой за исключением того, что на экспоненту оказывают влияние 128 в PDP-11, тогда как на это оказывают влияние 127 в IEEE-754. Значит, нужно делить на 2,0, а не 4,0. Это не заботится о NaNs и бесконечностях, но из моих поисков в Google, похоже, у PDP-11 их не было.

У вас также возникнут проблемы с переполнением. Формат PDP переполняется раньше, но я предполагаю, что это нормально, поскольку вы не можете ничего сделать, если число уже переполнено.

1
ответ дан 4 December 2019 в 04:21
поделиться

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.

0
ответ дан 4 December 2019 в 04:21
поделиться

Помимо NaN и Inf, у вас также могут возникнуть проблемы с преобразованием денормальных значений. Я не знаю, поддерживает ли их PDP-11, но IEEE 754 утверждает, что, когда поле экспоненты равно 0, тогда числа являются денормальными, что фактически означает, что подразумеваемая ведущая 1 в поле мантиссы становится 0. Таким образом, существует постепенная сходимость к 0 при уменьшении чисел.

@John - Стандарт IEEE 754 утверждает, что смещение экспоненты равно 127, а не 126. Wiki верна, а другая ссылка неверна. Таким образом, соотношение будет 2,0.

0
ответ дан 4 December 2019 в 04:21
поделиться
Другие вопросы по тегам:

Похожие вопросы: