Преобразование поплавка IEEE 754 в поплавок MIL-STD-1750A

Я пытаюсь преобразовать 32-разрядное значение IEEE 754 с плавающей запятой одинарной точности (стандартная переменная с плавающей запятой) в длинную переменную без знака в формате MIL-STD-1750A. Я включил спецификацию для IEEE 754 и MIL-STD-1750A в нижней части поста. Прямо сейчас у меня есть проблемы в моем коде с преобразованием экспоненты. Я также вижу проблемы с преобразованием мантиссы, но я еще не дошел до их исправления. Я использую примеры, перечисленные в таблице 3 по ссылке выше, чтобы подтвердить, правильно ли конвертирует моя программа. Некоторые из этих примеров не имеют смысла для меня.

  1. Как эти два примера могут иметь один и тот же показатель?

    .5 x 2^0 (0100 0000 0000 0000 0000 0000 0000 0000) 
    -1 x 2^0 (1000 0000 0000 0000 0000 0000 0000 0000)
    

    .5 x 2^0 имеет один десятичный знак, а -1 не имеет десятичных знаков, поэтому значение для.5 x 2^0 должно быть

    .5 x 2^0 (0100 0000 0000 0000 0000 0000 0000 0010)
    

    право? (0010 вместо 0001, потому что 1750A использует плюс 1 смещение)

  2. Как последний пример может использовать все 32 бита, а первый бит равен 1, что указывает на отрицательное значение?

    0.7500001x2^4 (1001 1111 1111 1111 1111 1111 0000 0100)
    
  3. Я вижу, что значение с показателем 127 должно быть 7F (0111 1111), но как насчет значения с отрицательным показателем 127? Это будет 81 (1000 0001)? Если так, то это потому что это дополнение +1 к 127?

Спасибо

1750ASpecification

2 ответа

Решение

1) Как эти два примера могут иметь один и тот же показатель степени?

Насколько я понимаю, знак и мантисса эффективно определяют значение дополнения до 2 в диапазоне [-1.0,1.0).

Конечно, это приводит к избыточным представлениям (0,125 * 21 = 0,25 * 20 и т. Д.). Таким образом, выбирается каноническое нормализованное представление, запрещающее значения мантиссы в диапазоне [-0,5,0,5).

Таким образом, в ваших двух примерах -1,0 и 0,5 попадают в "разрешенный" диапазон мантиссы, поэтому они оба имеют одинаковое значение показателя степени.

2) Как в последнем примере могут использоваться все 32 бита, а первый бит равен 1, что указывает на отрицательное значение?

Это не выглядит правильным для меня; как ты получил это представление?

3) Как насчет значения с отрицательным показателем 127? Это будет 81 (1000 0001)?

Я так считаю.

  1. Помните, что дробь является "подписанной дробью". Подписанные значения хранятся в формате дополнения 2. Так что думайте о нулях как о единицах.
    Таким образом, число может быть записано как -0.111111111111111111111 (основание 2) x 2^0, что близко к единице (сходится к 1,0, если моя математика верна)

  2. В последнем примере в исходном документе есть отрицательный знак (-0.7500001x2^4)

Другие вопросы по тегам