Поможем написать учебную работу
Если у вас возникли сложности с курсовой, контрольной, дипломной, рефератом, отчетом по практике, научно-исследовательской и любой другой работой - мы готовы помочь.

Предоплата всего

Подписываем
Если у вас возникли сложности с курсовой, контрольной, дипломной, рефератом, отчетом по практике, научно-исследовательской и любой другой работой - мы готовы помочь.
Предоплата всего
Подписываем
Лабораторная работа №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;
В виду сложности ввода и понимания большого количества нулей и единиц в программе должен быть предусмотрен раздельный ввод и вывод порядка, знака, мантиссы, причем вывод должен осуществляться в двоичном, десятичном и шестнадцатеричном виде.
Пример внешнего вида программы:
|
||||||
|
|
|