Поможем написать учебную работу
Если у вас возникли сложности с курсовой, контрольной, дипломной, рефератом, отчетом по практике, научно-исследовательской и любой другой работой - мы готовы помочь.
Если у вас возникли сложности с курсовой, контрольной, дипломной, рефератом, отчетом по практике, научно-исследовательской и любой другой работой - мы готовы помочь.
Лабораторная работа №4.
«Моделирование процессов преобразования информации в сопроцессоре».
Арифметический сопроцессор (FPU) устройство, непосредственно подключенное к центральному процессору (CPU) Intel и предназначенное для выполнения операций над числами в формате с плавающей точкой (вещественные числа) и длинными целыми числами.
Арифметический сопроцессор значительно (в десятки раз) ускоряет вычисления, связанные с вещественными числами. Он может вычислять такие функции как синус, косинус, логарифмы и т.д.
Очень важно понимать, как работает сопроцессор. Также очень важно понимать форматы его данных.
Данных сопроцессора храняться в 8-ми регистрах (ST0-ST7) во внутреннем формате (long double для C/C++, extended для Pascal). Прикладные программы читают эти данные из регистров и корректно декодируют.
Аналогичным процессам и посвящена данная лабораторная работа.
ОСНОВНЫЕ СВЕДЕНИЯ.
Прежде чем говорить о форматах вещественных чисел, используемых сопроцессором, вспомним о числах с плавающей точкой, встречающихся в научных расчетах. В общем виде эти числа можно записать следующим образом:
(знак)(мантисса)*10(знак)(порядок)
Например: -1.35*10-5
Здесь знак это минус (унарный плюс недопустим!), мантисса 1.35, порядок - -5. Как видите, порядок тоже может иметь знак. Вспомним также такое понятие, как нормализованное представление чисел:
если целая часть мантиссы числа состоит из одной, не равной нулю цифры, то число с плавающей точкой называется нормализованным.
Преимущество использования нормализованных чисел состоит в том, что для фиксированной разрядной сетки числа (для фиксированного количества цифр в числе) такие числа имеют наибольшую точность. Кроме того, нормализованное представление исключает неоднозначность каждое число с плавающей точкой может быть представлено различными (ненормализованными) способами:
123.5678*105 = 12.35678*106 = 1.235678*107 = 0.1235678*108
Для тех, кто программировал на языках высокого уровня должно быть знакомо следующее представление чисел с плавающей точкой:
(знак)(мантисса)Е(знак)(порядок).
Например, -5.35Е-2 означает число 5.35*10-2. Такое представление называется научной нотацией.
Сопроцессор фирмы Intel может работать с вещественными числами в трех форматах:
одинарной точности
двойной точности
расширенной точности
или
float
double
long double
для языка C/C++
single
double
extended
для Pascal/Delphi
Следует отметить, что тип real не поддерживается сопроцессором и его использование в программах нежелательно ввиду потерь времени на преобразование информации к форматам, поддерживаемым сопроцессором и обратно.
Числа в формате данных сопроцессора занимают соответственно 4, 8 и 10 байтов:
1 бит 8 бит 23 бита
1 бит 11 бит 52 бита
1 бит 15 бит 64 бита
На рисунке приведены числа одинарной, двойной и расширенной точности соответственно.
В любом представлении старший бит «Зн» определяет знак вещественного числа:
0 положительное число
1 отрицательное число
Обратите внимание: в отличие от целых чисел, вещественные представляются в прямом коде.
Все равные по абсолютному значению положительные и отрицательные числа отличаются только этим битом. В остальном числа с равным знаком полностью симметричны.
Арифметический сопроцессор работает с нормализованными числами, поэтому поле мантиссы содержит мантиссу нормализованного числа.
Здесь используется двоичное представление чисел. Сформулируем определение нормализованного числа для этого случая:
если целая часть мантиссы числа в двоичном представлении равна 1, то число с плавающей точкой называется нормализованным.
Так как для нормализованного двоичного числа целая часть всегда равна единице, то эту единицу можно не хранить. Именно так и поступили разработчики сопроцессора в форматах одинарной и двойной точности числа целая часть мантиссы не хранится. Таким образом экономится один бит памяти.
Для наглядности представим мантиссу числа в такой форме:
n.nnnnnn…n
Здесь символом n обозначается либо 0, либо 1. Нормализованные числа в крайней левой позиции содержат 1, поэтому их можно представить в виде:
1.nnnnnn…n
Представление с расширенной точностью используется сопроцессором для выполнения всех операций. И даже более того, все операции с числами сопроцессор выполняет только над числами в формате с расширенной точностью. В этом формате хранится и лишний бит целой части нормализованного числа.
Основная причина использования для вычислений чисел с расширенной точностью предохранение программы от возможной потери данных, связанной с погрешностью округления и конечностью разрядной сетки.
Поле порядка это степень двойки, на которую умножается мантисса, плюс смещение, равное 127 для одинарной точности, 1023 для двойной, 16383 для расширенной.
Для того, чтобы определить абсолютное значение числа с плавающей точкой, можно воспользоваться следующими формулами:
одинарная точность: 1.(цифры мантиссы)*2(Р-127)
двойная точность: 1.(цифры мантиссы)*2(Р-1023)
расширенная точность: 1.(цифры мантиссы)*2(Р-16383)
Знак числа, как уже говорилось, определяется старшим битом.
Приведем конкретный пример. Пусть мы имеем число с одинарной точностью, которое в двоичном виде выглядит так:
1 01111110 11000000000000000000000
Для этого числа знак равен 1 (отрицательное число), порядок 126, мантисса 11 (в двоичной системе счисления, то есть 0.11 в двоичном виде или 2-1 + 2-2 = 0.5+0.25+0.75 в десятичном). С учетом целой части, это число равно:
-1.11*2(126-127) = - (2+0.5+0.25) * 2-1 = -1.75*0.5= -0.875
Вообще, двоичная мантисса вида 1.nnnnnnnnnn означает следующее:
2 + n*2-1+n*2-2+…+n*2-k
Следует учесть, что не все десятичные числа могут быть разложены в конечный ряд по степеням двойки, например 0.1
ЗАДАНИЕ НА ЛАБОРАТОРНУЮ РАБОТУ.
Необходимо реализовать программу, выполняющую конверсию введенного с клавиатуры десятичного числа с плавающей точкой в формат сопроцессора и обратное преобразование (вводится двоичное представление, программа выдает соответствующее десятичное число). Ввод осуществляется с клавиатуры, вывод на экран.
Программа должна поддерживать все три типа данных сопроцессора.
В программе должна присутствовать проверка правильности конверсии путем сравнения с реальным представлением числа в сопроцессоре, например:
program chek;
a : extended;
b : array [1..10] of byte absolute a;
begin
for i:=1 to 10 do
dec2bin(a[i]);
endfor
end;
program dec2bin(a:byte);
begin
for i:=1 to 8 do
write(a mod 2);
a:=a div 2;
end;
end;
В виду сложности ввода и понимания большого количества нулей и единиц в программе должен быть предусмотрен раздельный ввод и вывод порядка, знака, мантиссы, причем вывод должен осуществляться в двоичном, десятичном и шестнадцатеричном виде.
Пример внешнего вида программы:
|
||||||
|
|
|