Код магнитолы

JS - телефон

Оппозиция в России ?

Россия и Украина

Мысли в слух...

JS - часы

Российская...власть ?

Skype

Создаём сайт

Любимые сериалы

Гостевая


На главную

Все числа в гости к нам...ещё одно отступление

Арифметические процессоры, которые обычно называются сопроцессорами, обрабатывают информацию, представленную в формате действительных чисел, как целых, так и имеющих целую и дробную часть. Как уже упоминалось, объяснить процессору символ разделения целой и дробной части числа, довольно не просто. Вне зависимости от формата данные, передаваемые на обработку в сопроцессор, преобразуются во внутреннее представление, занимающее 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. Все остатки и последнее частное должны записываться в память с тройками, т.е. 31323334. .
Один из выше изложенных вариантов можно положить в основу механизма преобразования строки символов в число и...обратно.
Второй вариант - более привлекателен. От первого попахивает логарифмами.
А, теперь, давайте усвоим всё выше сказанное и... вернёмся к реальности. А реальность такова - дробные числа со знаками (читай - работа с сопроцессором) - это перспектива. Вернёмся на нашу грешную землю и...займёмся целочисленной, положительной арифметикой...с процессором. В любом случае - это прогресс.

дальше...
...назад