Главная /
Ассемблер /
Для чайников /
Введение /
Представление данных /
Вещественные числа /
Числа с плавающей точкой
Чтобы повысить точность и максимально компактно расположить вещественное число
в памяти компьютера, были придуманы числа с плавающей точкой. В старшие биты стали
записывать порядок числа (см. раздел
Нормализованная запись числа).
Размер порядка числа известен заранее (зависит от типа данных) и занимает
намного меньше места, чем могла бы занять целая часть числа.
В младшие биты стали записывать мантиссу – нормализованную экспоненциальную форму числа
без запятой. Таким образом, в пределах мантиссы точка может как бы «плавать»,
то есть её расположение зависит от порядка числа.
Но как заставить эту точку плавать? Этим занимается
процессор,
то есть аппаратная часть компьютера. Во многих современных процессорах даже есть
специальные команды для операций над числами с плавающей точкой (но об этом позже).
В большинстве компьютеров используются именно числа с плавающей точкой (а не с фиксированной),
потому что это позволяет экономить память и получать большую точность.
Вспомним алгоритм представления вещественного числа в памяти компьютера:
- Перевести число из Р-ичной системы в двоичную
- Представить двоичное число в нормализованной экспоненциальной форме
- Рассчитать смещённый порядок числа
- Разместить знак, порядок и мантиссу в соответствующие разряды
В разделе
Представление вещественных чисел в памяти компьютера
первый шаг мы уже сделали и получили двоичное представление целой и дробной части числа 3,14:
3 = 11b
0,14 = 0,00100011b
То есть число 3,14 в двоичном виде равно:
3,14 = 11,00100011b
Теперь преобразуем это число в нормализованную экспоненциальную форму:
11,00100011b = 1,100100011b * 21
Теперь рассчитаем
смещённый порядок (предположим,
что для хранения порядка у нас используется 5 бит). Тогда исходные данные:
ИП = 1 (у нас 2 в степени 1)
k = 5
СП = ИП + 2k-1 – 1 = 1 + 25-1 – 1 = 1 + 16 – 1 = 16
Записываем знак числа, порядок и мантиссу в соответствующие разряды:
Знак |
Порядок |
Мантисса |
0 |
10000 |
0010001100 |
Как видите, в мантиссе у нас младшие два разряда – это нули. Эти разряды нами не используются,
но при желании мы бы могли их использовать и тем самым повысить точность.
А теперь давайте спустимся с небес на землю. Все приведённые нами примеры являются
упрощёнными. В реальных машинах обычно для чисел с плавающей точкой используются числа
с большим количеством разрядов. Но реальные числа мы здесь рассматривать не будем,
тем более что представление данных может отличаться в зависимости от процессора.
Для первого знакомства информации достаточно. Возможно, что эту тему я расширю в
будущих изданиях книги. А пока, если хотите знать больше – изучайте стандарт IEEE 754,
который реализован во всех х86-совместимых процессорах. Ну а нам пора переходить
непосредственно к Ассемблеру…