Вещественные числа в памяти компьютера
Автор-составитель: Сорока Богдан
Вещественные числа в памяти компьютера представляются в форме с плавающей точкой.
Форма с плавающей точкой использует представление вещественного числа R в виде произведения мантиссы m на основание системы счисления р в некоторой целой степени n, которую называют порядком:
R = m * (р^n) Например, число 25,324 можно записать в таком виде: 0.25324х102. Здесь m=0.25324 — мантисса, n=2 — порядок. Порядок указывает, на какое количество позиций и в каком направлении должна «переплыть», т.е. сместиться десятичная точка в мантиссе. Отсюда название «плавающая точка».
Однако справедливы и следующие равенства:
25,324 = 2,5324*(10^1) = 0,0025324*(10^4) = 0,25324*(10^2) и т.п. Получается, что представление числа в форме с плавающей точкой неоднозначно? Чтобы не было неоднозначности, в ЭВМ используют нормализованное представление числа в форме с плавающей точкой. Мантисса в нормализован-ном представлении должна удовлетворять условию:
0,1p <= m < 1p. Иначе говоря, мантисса меньше единицы и первая значащая цифра — не ноль. Значит для рассмотренного числа нормализованным представлением будет: 0.25324 * 102. В разных типах ЭВМ применяются различные варианты представления чисел в форме с плавающей точкой. Для примера рассмотрим один из возможных. Пусть в памяти компьютера вещественное число представляется в форме с плавающей точкой в двоичной системе счисления (р=2) и занимает ячейку размером 4 байта. В ячейке должна содержаться следующая информация о числе: знак числа, порядок и значащие цифры мантиссы. Вот как эта информация располагается в ячейке:
± машинный порядок М А Н Т И С С А
1-й байт 2-й байт 3-й байт 4-й байт
В старшем бите 1-го байта хранится знак числа. В этом разряде 0 обозначает плюс, 1 — минус. Оставшиеся 7 бит первого байта содержат машинный порядок. В следующих трех байтах хранятся значащие цифры мантиссы.
Что такое машинный порядок? В семи двоичных разрядах помещаются двоичные числа в диапазоне от 0000000 до 1111111. В десятичной системе это соответствует диапазону от 0 до 127. Всего 128 значений. Знак порядка в ячейке не хранится. Но порядок, очевидно, может быть как положительным так и отрицательным. Разумно эти 128 значений разделить поровну между положительными и отрицательными значениями порядка. В таком случае между машинным порядком и истинным (назовем его математическим) устанавливается следующее соответствие:
Машинный порядок 0 1 2 3 ... 64 65 ... 125 126 127 Математический порядок -64 -63 -62 -61 ... 0 1 ... 61 62 63 Если обозначить машинный порядок Мр, а математический — р, то связь между ними ыразится такой формулой:
Мр = р + 64. Итак, машинный порядок смещен относительно математического на 64 единицы и имеет только положительные значения. При выполнении вычислений с плавающей точкой процессор это смещение учитывает.
Полученная формула записана в десятичной системе. Поскольку 6410=4016 (проверьте!), то в шестнадцатеричной системе формула примет вид:
Мр16 = р16 + 4016 И, наконец, в двоичной системе:
Мр2 = р2+100 00002 Теперь мы можем записать внутреннее представление числа 25,324 в форме с плавающей точкой. Переведем его в двоичную систему счисления с 24 значащими цифрами. 25,32410= 11001,01010010111100011012 Запишем в форме нормализованного двоичного числа с плавающей точкой: 0,110010101001011110001101*10101 Здесь мантисса, основание системы счисления (210=102) и порядок (510=1012)записаны в двоичной системе. Вычислим машинный порядок. Мр2 = 101 + 100 0000 = 100 0101 Запишем представление числа в ячейке памяти. 01000101 11001010 10010111 10001101 Это и есть искомый результат. Его можно переписать в более компактной шестнадцатеричной форме:
45 CA 97 8D Для того, чтобы получить внутреннее представление отрицательного числа -25,324,достаточно в полученном выше коде заменить в разряде знака числа 0 на 1.
Получим:
11000101 11001010 10010111 10001101 А в шестнадцатеричной форме:
C5 CA 97 8D Никакого инвертирования, как для отрицательных чисел с фиксированной точкой, здесь не происходит.
Рассмотрим, наконец, вопрос о диапазоне чисел, представимых в форме с плавающей точкой. Очевидно, положительные и отрицательные числа расположены симметрично относительно нуля. Следовательно, максимальное и минимальное числа равны между собой по модулю: Rmax = |Rmin|. Наименьшее по абсолютной величине число равно нулю. Чему же равно Rmax? Это число с самой большой мантиссой и самым большим порядком:
0,111111111111111111111111*1021111111 Если перевести в десятичную систему, то получится
Rmax = (1 - 2-24) * 264 = 1019 Очевидно, что диапазон вещественных чисел значительно шире диапазона целых чисел. Если в результате вычислений получается число по модулю большее, чем Rmax, то происходит прерывание работы процессора. Такая ситуация называется переполнением при вычислениях с плавающей точкой. Наименьшее по модулю ненулевое значение равно:
(1/2) * 2-64=2-66. Любые значения, меньшие данного по абсолютной величине, воспринимаются процессором как нулевые.
Как известно из математики, множество действительных чисел бесконечно и непрерывно. Множество же вещественных чисел, представимых в памяти ЭВМ в форме с плавающей точкой, является ограниченным и дискретным. Каждое следующее значение получается прибавлением к мантиссе предыдущего единицы в последнем (24-м) разряде. Количество вещественных чисел, точно представимых в па-мяти машины, вычисляется по формуле:
N = 2t * ( U - L+ 1) + 1. Здесь t — количество двоичных разрядов мантиссы; U — максимальное значение математического порядка; L — минимальное значение порядка. Для рассмотренного нами варианта (t = 24, U = 63, L = -64) получается:
N = 2 146 683 548. Все же остальные числа, не попадающие в это множество, но находящиеся в диапазоне допустимых значений, представляются в памяти приближенно (мантисса обрезается на 24-м разряде). А поскольку числа имеют погрешности, то и результаты вычислений с этими числами также будут содержать погрешность. Из сказанного следует вывод: вычисления с вещественными числами в компьютере выполняются приближенно.