Студопедия

КАТЕГОРИИ:


Архитектура-(3434)Астрономия-(809)Биология-(7483)Биотехнологии-(1457)Военное дело-(14632)Высокие технологии-(1363)География-(913)Геология-(1438)Государство-(451)Демография-(1065)Дом-(47672)Журналистика и СМИ-(912)Изобретательство-(14524)Иностранные языки-(4268)Информатика-(17799)Искусство-(1338)История-(13644)Компьютеры-(11121)Косметика-(55)Кулинария-(373)Культура-(8427)Лингвистика-(374)Литература-(1642)Маркетинг-(23702)Математика-(16968)Машиностроение-(1700)Медицина-(12668)Менеджмент-(24684)Механика-(15423)Науковедение-(506)Образование-(11852)Охрана труда-(3308)Педагогика-(5571)Полиграфия-(1312)Политика-(7869)Право-(5454)Приборостроение-(1369)Программирование-(2801)Производство-(97182)Промышленность-(8706)Психология-(18388)Религия-(3217)Связь-(10668)Сельское хозяйство-(299)Социология-(6455)Спорт-(42831)Строительство-(4793)Торговля-(5050)Транспорт-(2929)Туризм-(1568)Физика-(3942)Философия-(17015)Финансы-(26596)Химия-(22929)Экология-(12095)Экономика-(9961)Электроника-(8441)Электротехника-(4623)Энергетика-(12629)Юриспруденция-(1492)Ядерная техника-(1748)

Представление вещественных чисел




Принципиальное отличие между вещественными и целыми числами: целые числа дискретны, и отсюда (если не брать во внимание эффект переполнения) каждому целому числу соответствует уникальный двоичный код; вещественные числа, напротив, непрерывны, а значит, не могут быть полностью корректно перенесены в дискретную по своей природе вычислительную машину. Это означает, что некоторые вещественные числа, незначительно отличающиеся друг от друга, могут иметь одинаковый код.

Отбрасывание младших двоичных разрядов при переходе ко внутреннему двоичному представлению приводит к появлению специфической "машинной" погрешности.

Существует два способа представления вещественных чисел: с фиксированной и с плавающей запятой. Однако в связи с тем, что первый способ сейчас практически не используется, найти понятное его описание в современных учебниках довольно трудно.

В старых машинах, использовавших фиксированное размещение запятой, положение последней в разрядной сетке ЭВМ было заранее обусловлено – раз и навсегда для всех чисел и для всех технических устройств. Поэтому отпадала необходимость в каком-либо способе ее указания во внутреннем представлении чисел. Все вычислительные алгоритмы были заранее "настроены" на это фиксированное размещение.

Итак, подробное рассмотрение представления чисел с фиксированным размещением запятой не только показало его недостатки, но и неявно наметило путь их устранения.

В самом деле, если наиболее сложным и трудоемким местом является масштабирование данных, надо его автоматизировать. Иными словами, надо научить машину самостоятельно размещать запятую так, чтобы числа при счете по возможности не выходили за разрядную сетку и сохранялись с максимальной точностью. Для этого, разумеется, придется разрешить ЭВМ "перемещать" запятую, а значит, дополнительно как-то сохранять в двоичном представлении числа ее текущее положение. В этом, собственно, и заключается представление чисел с плавающей запятой.

Интересно, что удобное представление вещественных чисел не пришлось специально придумывать. В математике уже существовал подходящий способ записи, основанный на том факте, что любое число A в системе счисления с основанием Q можно записать в виде:

A = (± M) x Q ± P.

где M называют мантиссой, а показатель степени P - порядком числа.

Например, 0,03 = 3 х 10 -2 = 30 х 10 -3 = 0,3 х 10 -1 = 0,03 х 10 0 =... То есть, представление числа с плавающей запятой не является единственным. Поэтому договорились для выделения единственного варианта записи числа считать, что мантисса всегда меньше единицы, а ее первый разряд содержит отличную от нуля цифру – в нашем примере обоим требованиям удовлетворит только число 0,3 х 10 -1.

Описанное представление чисел называется нормализованным и является единственным. Любое число может быть нормализовано. Особо подчеркнем, что требования к нормализации чисел вводятся исходя из соображений обеспечения максимальной точности их представления.

Все сказанное о нормализации можно применять и к двоичной системе:

A = (± M) x 2 ± P.

Например: - 3 10 = - 0,11 x 210, M = 0,11 и P = 10.

Существенно, что двоичная мантисса всегда начинается с единицы. Поэтому во многих ЭВМ эта единица не записывается в ОЗУ, что позволяет сохранить еще один дополнительный разряд мантиссы (так называемая скрытая единица).

Арифметика чисел с плавающей запятой оказывается заметно сложнее, чем с фиксированной. Например, чтобы сложить два числа с плавающей запятой, требуется предварительно привести их к представлению, когда оба порядка равны; такую процедуру принято называть выравниванием порядков. Кроме того, в результате вычислений нормализация часто нарушается, а значит необходимо ее восстанавливать. Тем не менее, вычислительные машины со всем этим великолепно умеют автоматически справляться, и именно такой способ вычислений лежит в основе работы современных компьютеров.

Таким образом, мы видим, что при использовании метода представления вещественных чисел с плавающей запятой фактически хранится два числа: мантисса и порядок. Разрядность первой части определяет точность вычислений, а второй – диапазон представления чисел.

Разъясним сказанное выше на примере. Например, 120100000 = 1,201 × 108. Поскольку каждая позиция десятичного числа отличается от соседней на степень числа 10, умножение на 10 эквивалентно сдвигу десятичной запятой на одну позицию вправо. Аналогично деление на 10 сдвигает десятичную запятую на позицию влево. Поэтому приведенный выше пример можно продолжить: 120100000 = 1,201 × 108 = 0,1201 × 109 = 12,01 × 107. Десятичная запятая "плавает" в числе и больше не помечает абсолютное место между целой и дробной частями.

Для того чтобы сохранить максимальную точность, вычислительные машины почти всегда хранят мантиссу в нормализованном виде, что означает, что мантисса в данном случае есть число, лежащее между 1(10) и 2(10) (1 < M < 2). Способ хранения мантиссы с плавающей точкой подразумевает, что двоичная запятая находится на фиксированном месте. Фактически подразумевается, что двоичная запятая следует после первой двоичной цифры, т.е. нормализация мантиссы делает единичным первый бит, помещая тем самым значение между единицей и двойкой. Место, отводимое для числа с плавающей точкой, делится на два поля. Одно поле содержит знак и значение мантиссы, а другое содержит знак и значение порядка.

Современный персональный компьютер позволяет работать со следующими действительными типами (диапазон значений указан по абсолютной величине; в некоторых случаях перечень типов данных может быть расширен):

Тип Диапазон Мантисса Байты
Real 2,9×10-39..1,7×1038 11-12  
Single 1,5×10-45..3,4×1038 7-8  
Double 5,0×10-324..1,7×10308 15-16  
Extended 3,4×10-4932..1,1×104932 19-20  

Покажем преобразование действительного числа для представления его в памяти ЭВМ на примере величины типа Double.

Как видно из таблицы, величина это типа занимает в памяти 8 байт. На рисунке ниже показано, как здесь представлены поля мантиссы и порядка (нумерация битов осуществляется справа налево):

S Смещенный порядок Мантисса
  62..52 51..0

Можно заметить, что старший бит, отведенный под мантиссу, имеет номер 51, т.е. мантисса занимает младшие 52 бита. Черта указывает здесь на положение двоичной запятой. Перед запятой должен стоять бит целой части мантиссы, но поскольку она всегда равна 1, здесь данный бит не требуется и соответствующий разряд отсутствует в памяти (но он подразумевается). Значение порядка хранится здесь не как целое число, представленное в дополнительном коде. Для упрощения вычислений и сравнения действительных чисел значение порядка в ЭВМ хранится в виде смещенного числа, т.е. к настоящему значению порядка перед записью его в память прибавляется смещение. Смещение выбирается так, чтобы минимальному значению порядка соответствовал нуль. Например, для типа Double порядок занимает 11 бит и имеет диапазон от 2-1023 до 21023, поэтому смещение равно 1023(10) = 1111111111(2). Наконец, бит с номером 63 указывает на знак числа.

Таким образом, из вышесказанного вытекает следующий алгоритм для получения представления действительного числа в памяти ЭВМ:

1. Перевести модуль данного числа в двоичную систему счисления;

2. нормализовать двоичное число, т.е. записать в виде M × 2 p, где M — мантисса (ее целая часть равна 1(2)) и p — порядок, записанный в десятичной системе счисления;

3. прибавить к порядку смещение и перевести смещенный порядок в двоичную систему счисления;

4. учитывая знак заданного числа (0 — положительное; 1 — отрицательное), выписать его представление в памяти ЭВМ.

Пример 2. Запишем код числа -312,3125.

1. Двоичная запись модуля этого числа имеет вид 100111000,0101.

2. Проведем нормализацию, получим 100111000,0101 = 1,001110000101 × 28.

3. Находим смещенный порядок: 8 + 1023 = 1031. Далее имеем 1031(10) = 10000000111(2).

4. Окончательно

     
  62..52 51..0

Очевидно, что более компактно полученный код стоит записать следующим образом: C073850000000000(16).

Пример 3. Обратный переход от кода действительного числа к самому числу.

Пусть дан код 3FEC600000000000(16) или

     
  62..52 51..0

1. Прежде всего замечаем, что это код положительного числа, поскольку в разряде с номером 63 записан нуль. Получим порядок этого числа: 01111111110(2) = 1022(10); 1022 - 1023 = -1.

2. Число имеет вид 1,1100011 × 2-1 или 0,11100011.

3. Переводом в десятичную систему счисления получаем 0,88671875.

 

Таким образом, если сравнить между собой представление целых и вещественных чисел, то станет отчетливо видно, как сильно различаются числа, скажем, 3 и 3,0. Поэтому не стоит удивляться тому, что в языках программирования проблема перевода чисел из одной формы в другую имеет определенные особенности.




Поделиться с друзьями:


Дата добавления: 2014-01-11; Просмотров: 2310; Нарушение авторских прав?; Мы поможем в написании вашей работы!


Нам важно ваше мнение! Был ли полезен опубликованный материал? Да | Нет



studopedia.su - Студопедия (2013 - 2024) год. Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав! Последнее добавление




Генерация страницы за: 0.055 сек.