Будет ли этот 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);
}

--- Алистер.

10 голосов | спросил user41013 12 FebruaryEurope/MoscowbFri, 12 Feb 2010 12:07:19 +0300000000pmFri, 12 Feb 2010 12:07:19 +030010 2010, 12:07:19

2 ответа


0

Код не проверяет неопределенное значение , clean-zero и dirty-zero , но делит на 4, что обсуждалось в других ответы, это хорошо. ФП, вероятно, знает это, потому что они заметили бы, если результат всегда был неправильным. Смещение экспонентов также смутило меня сегодня, поэтому я процитирую то, что я только что прочитал в этом прекрасном документе: .htm" rel =" nofollow "> Двоичные числа с плавающим битом :

  

Сначала скрытому биту присваивается другая позиция. IEEE предполагает этот бит   до дробного периода и Digital принимает его сразу после   тот период. Согласно IEEE видимая часть мантиссы   ('visman') начинается сразу после периода, в то время как в соответствии с   Цифровой начинается за скрытый бит. Таким образом, диапазон значений   общая мантисса составляет:

IEEE:      1.0 =<  (1.visman)  < 2.0
Digital:   0.5 =< (0.1 visman) < 1.0
     

Во-вторых, избыточные отклонения в обозначениях показателя степени отличаются. [на 1 ...]

     

Оба эффекта вместе делают этот битовый паттерн в IEEE-float   представляет число четыре раза в размере значения одного и того же бита   шаблон в Digital-Float означает.

Это также объясняет, почему в некоторых источниках указано, что смещение IEEE составляет 126.

ответил marcin 16 thEurope/Moscowp30Europe/Moscow09bEurope/MoscowSun, 16 Sep 2012 23:17:19 +0400 2012, 23:17:19
0

PDP-11 использовал представление со смешанным порядком байтов для чисел с плавающей запятой. так что эта часть кода

uFloat.pdp11 = (input.word[0] << 16) + input.word[1];

правильно, если ваши данные еще не были поменяны местами до того, как вы их получили.

В этом документе приводятся подробные сведения о представлении множества различных форматов с плавающей запятой http: //www.quadibloc.com/comp/cp0201.htm

В нем говорится, что t PDP-11 /VAX использовал избыточные 128 обозначений для показателя степени. в то время как IEEE 754 использует избыточную запись 126, поэтому, если она верна, деление на 4 кажется правильным способом корректировки показателя степени.

Однако , Википедия говорит, что смещение экспоненты для IEEE 754 равно 127, а не 126. Поэтому либо в приведенном выше документе используется странная запись, либо она неверна. Возможно, вам нужно разделить на 2, а не на 4.

ответил John Knoeller 12 FebruaryEurope/MoscowbFri, 12 Feb 2010 12:21:12 +0300000000pmFri, 12 Feb 2010 12:21:12 +030010 2010, 12:21:12

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

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132