Преобразование поплавка IEEE 754 в поплавок MIL-STD-1750A
Я пытаюсь преобразовать 32-разрядное значение IEEE 754 с плавающей запятой одинарной точности (стандартная переменная с плавающей запятой) в длинную переменную без знака в формате MIL-STD-1750A. Я включил спецификацию для IEEE 754 и MIL-STD-1750A в нижней части поста. Прямо сейчас у меня есть проблемы в моем коде с преобразованием экспоненты. Я также вижу проблемы с преобразованием мантиссы, но я еще не дошел до их исправления. Я использую примеры, перечисленные в таблице 3 по ссылке выше, чтобы подтвердить, правильно ли конвертирует моя программа. Некоторые из этих примеров не имеют смысла для меня.
Как эти два примера могут иметь один и тот же показатель?
.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 смещение)
Как последний пример может использовать все 32 бита, а первый бит равен 1, что указывает на отрицательное значение?
0.7500001x2^4 (1001 1111 1111 1111 1111 1111 0000 0100)
Я вижу, что значение с показателем 127 должно быть 7F (0111 1111), но как насчет значения с отрицательным показателем 127? Это будет 81 (1000 0001)? Если так, то это потому что это дополнение +1 к 127?
Спасибо
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)?
Я так считаю.
Помните, что дробь является "подписанной дробью". Подписанные значения хранятся в формате дополнения 2. Так что думайте о нулях как о единицах.
Таким образом, число может быть записано как -0.111111111111111111111 (основание 2) x 2^0, что близко к единице (сходится к 1,0, если моя математика верна)В последнем примере в исходном документе есть отрицательный знак (-0.7500001x2^4)