Все числа в гости к нам...ещё одно отступление
Арифметические процессоры, которые обычно называются сопроцессорами, обрабатывают информацию,
представленную в формате действительных чисел, как целых, так и имеющих целую и дробную часть. Как уже
упоминалось, объяснить процессору символ разделения целой и дробной части числа, довольно не
просто. Вне зависимости от формата данные, передаваемые на обработку в сопроцессор,
преобразуются во внутреннее представление, занимающее 80 бит, и записываются в
один из регистров общего назначения
st...st(7). После завершения обработки результат может
быть переслан в память, а перед этим преобразован в необходимый формат. Другими словами,
сопроцессор видит числа по своему, независимо от того, в каком формате они представлены.
Все действительные числа, независимо от используемого формата, хранятся в нормализованном
виде. Нормализованным называется число, целая часть которого состоит из одной не равной нулю
цифры. Это справедливо для всех систем счисления, только в двоичной - это будет "
1", а её
процессор,
в нашем случае, не учитывает. Это позволяет
увеличить число на
разряд.
Попробуем
разобратся - что из себя представляет число, которое поймёт процессор.
Вариант № 1:
Возмём условное число
54,78. Целую и дробную часть будем преобразовывать по-отдельности:
целая часть: снизу-вверх дробная часть: сверху-вниз
54 |2 0,78 x 2 = 1,56 -> 1
54 27 |2 0,56 x 2 = 1,12 -> 1
0 26 13 |2 0,12 x 2 = 0,24 -> 0
1 12 6 |2 0,24 x 2 = 0,48 -> 0
1 6 3 |2 0,48 x 2 = 0,96 -> 0
0 2 1 |2 0,96 x 2 = 1,92 -> 1
1 0 0* 0,92 x 2 = 1,84 -> 1
1 0,84 x 2 = 1,68 -> 1
...
5410 = 1101102 0,7810 ~ 110001112
* этот 0 не значащий, мы его не записали
В общем:
54,7810 = 110110,110001112.
В преобразовании
дробной части мы не поставили знак равенства, поскольку оно не закончилось. В этом случае,
при обратном преобразовании, исходное число будет отличатся в каком-то знаке после запятой.
В каком именно, можно проверить по формуле:
А = В + С х 2-k, где
А - число
В - целая часть числа
С - дробная часть числа
k - к-во разрядов в дробной части
Проверим свои преобразования:
54,78 = 54 + 199 х 2-8 = 54,77734375То-есть,
8-ми разрядная дробная
часть даёт достаточно точный результат при обратном преобразовании.
Остался последний шаг - нормализовать полученое число и представить его в удобоваримом для
сопроцессора виде:
110110,11000111 --> 1,1011011000111 x 2101 - мы сместили запятую на 5
разрядов влево, она стала
плавающей. Представим наше число в экспотенциальной форме. В общем виде:
X = S x M x Nq, где
X - вещественное число
S - знак числа
M - мантисса
N - основание системы счисления
q - экспонента, часто называемая порядком, который определяет положение запятой в мантиссе
Данная форма записи позволяет перемещать запятую, в вещественном числе, вправо и влево,
не меняя истинного значения числа, а поскольку система двоичная, то N = 2.
Для представления
таких чисел существует стандарт IEEE 754-1985. Согласно этого стандарта старший разряд нашего
числа =
0 (число положительное). Стандарт представления -
короткий
(одинарной точности): для хранения числа отводится 32 бита, под мантиссу 23 бита. Согласно
стандарта порядок должен хранится в
смещённом формате:
q = р + значение
смещения (в нашем случае это +127). Часто "
q" называют характеристикой.
Поскольку
"1" в целой части мантиссы всегда присутствует (двоичный код), то целую
часть мы можем отбрoсить, т.к. для нашего (короткого) формата она учитывается аппаратно.
Что мы в итоге имеем:
мантисса -
1011011000111характеристика -
5 + 127 = 132 --> 10000100
знак числа -
0В конечном виде, двоичное нормализованое представление числа 54,78:
0 10000100 10110 11000111 0000000000
(+) характеристика 54 . 78 ...до 32
Естественно - запись без пробелов.
Для удобства восприятия (не каламбур) представим число в hex-виде:
0100 0010 0101 1011 0001 1100 0000 0000
4 2 5 В 1 С 0 0
42 5В 1С 00
Естественно, продолжи мы
преобразование дробной части, вместо последних нулей было-бы hex-число.
Вариант № 2:
Метод преобразования базируется на том, что ASCII-формат имеет основание 10, а компьютер
выполняет арифметические операции только над числами с основанием 2. Процедура преобразования
заключается в следующем:
1. Начинают с самого правого байта числа в ASCII-формате и обрабатывают справа налево
2. Удаляют тройки из левых hex-цифр каждого ASCII-байта
3. Умножают ASCII-цифры на 1, 10, 100 (1, Ah, 64h) и т.д. и складывают результаты :
Десятичное Шестнадцатиричное
4 х 1 = 4 4
3 х 10 = 30 1E
2 х 100 = 200 C8
1 х 1000 = 1000 3E8
---- ----
Результат: 1234 04D2
Для обратного преобразования мы воспользуемся делением двоичного числа на 10 (0Ah) пока
результат не будет меньше 10. Остатки, которые лежат в границах от 0 до 9, образуют
число в ASCII-формате:
Частное Остаток
4D2h : Ah 7Bh 4
7Bh : Ah Ch 3
Ch : Ah 1h 2
Так как последнее частное 1 меньше, чем Ah, то операция завершена. Остатки вместе с
последним частным образуют результат в ASCII-формате, записываемый справа налево 1234.
Все остатки и последнее частное должны записываться в память с тройками, т.е. 3
13
23
33
4. .
Один из выше изложенных вариантов можно положить в основу
механизма
преобразования строки символов в число и...обратно.
Второй вариант - более привлекателен.
От первого попахивает логарифмами.
А, теперь, давайте усвоим всё выше сказанное и...
вернёмся к реальности. А реальность такова - дробные числа со знаками (читай - работа с
сопроцессором) - это перспектива. Вернёмся на нашу грешную землю и...займёмся целочисленной,
положительной арифметикой...с процессором. В любом случае - это прогресс.
дальше...
...назад