Представление вещественных чисел с плавающей точкой служит для хранения в памяти целых и дробных чисел. Формат с плавающей точкой использует представление числа A в виде произведения мантиссы M на основание системы счисления q в некоторой степени p, которую называют порядком числа:
A= ±M•q+p, обычно 0< |M|< 1.
Представление чисел в форме с плавающей точкой неоднозначно:
12345. 1.2345•104 0.12345•105
1.2345 0.012345•102 0.12345•101
12.345•10-1 12345•10-4 123450•10-5
Чтобы не было неоднозначности, числа с плавающей точкой хранятся в компьютере в виде нормализованной мантиссы и порядка. Нормализованная мантисса – это правильная дробь, у которой первая цифра после точки отлична от нуля.
Общий вид представления чисел в форме с плавающей точкой:
знак числа | знак порядка | порядок | нормализованная мантисса |
Например, для чисел с плавающей точкой, занимающих 4 байта памяти, в старшем бите первого байта хранится знак числа, а последующие 8 битов содержат машинный порядок числа. В следующих 23-х битах хранятся значения цифр мантиссы.
В 8 битах, предназначенных для порядка, помещаются 2-ичные числа от 00000000 до11111111 (от 0 до 25510 – всего 256 значений). Так как порядок может быть и отрицательным, то эти значения необходимо поделить поровну между положительными и отрицательными значениями порядка от -128 до 127)
Чтобы избавиться от знака порядка, математический порядок смещается так, чтобы минимальному значению математического порядка (-128) соответствовал 0 – получатся машинный порядок. Тогда для приведенного примера смещение равно 12810 == 100000002==8016.
Сегодня рассмотренное представление изменено:
знак числа | характеристика | усеченная мантисса |
Если нормализованное двоичное представление числа преобразовать таким образом, чтобы целая часть его стала содержать всего одну единицу, то число, получившееся после запятой, есть усеченная мантисса. При этом изменяется и порядок числа (в соответствии с количеством и направлением перемещения позиции точки), он становится усеченным порядком. Характеристика – это число, полученное от сложения усеченного порядка с числом смещения 7 F16 (12710) – для 4-хбайтного представления или 3FF16 (102310) – для 8-ибайтного представления[2]. Число смещения, как мы видим, уменьшается на 1 (7F16 вместо 8016), т.к. единица, выделенная и отброшенная при получении усеченной мантиссы, нигде не пишется и учитывается только автоматически при смещении математического порядка.
Алгоритм получения логического представления числа с плавающей точкой:
· Исходное число переводится в 16-ричную систему счисления (отдельно целая и дробная части).
· Полученное представление числа в 16-ричной системе счисления преобразуется в его представление в 2-ичной системе счисления.
· 2-ичное представление числа преобразуется для получения усеченной мантиссы и усеченного порядка.
· Записывается двоичное представление числа:
· в старшем бите записывается знак числа (0 – для положительных чисел или 1 – для отрицательных);
· в следующих 8 битах слева направо (для 4-хбайтного представления) или 11 (для 8-ибайтного представления) записывается характеристика;
· в оставшихся битах записывается усеченная мантисса (слева направо): под нее отводится 23 бита для 4-хбитного представления: (4*8=32 – 1 знаковый бит – 8 бит под характеристику = 23 бита) и 52 бита для 8-байтного представления (8*8=64 – 1 знаковый бит – 11 бит под характеристику = 52 бита).
Например, для числа с одинарной точностью (float) имеем:
Знак
Порядок (8 бит)
Мантисса (23 бита)
30
23
22
0
Порядок записывается со сдвигом, равным 28-1-1== 127 == 7 F 16
Например:
-256,510 = ?
25610 = 010016 =1 0000 00002
0,510 = 0.816 = 0.10002
-256,510 = -1 0000 0000 . 10002 = -1 . 0000 0000 10002 *28
Формирование числа в 4-х байтах | Формирование числа в 8 байтах |
Характеристика числа равна: 7F + 8 = 8716 == 1000 01112 | Характеристика числа равна: 3 F F + 8 = 40716 == 100 0000 01112 |
Усеченная мантисса: 00 80 00 0016 0000 0000 1000 0000 0000 0000 2 | Усеченная мантисса: 00 80 00 00 00 00 016 |
Полное представление числа: 1 1000 0111 0000 0000 1000 0000 0000 000 2= = 1100 0011 1000 0000 0100 0000 0000 0000 2= = С3 80 40 00 16 | Полное представление числа: С0 70 08 00 00 00 00 00 16 |
В памяти число хранится в перевернутом (по байтам) виде: 00 40 80 С3 | В памяти число хранится в виде: 00 00 00 00 00 08 70 С0 |
Диапазон вещественных чисел значительно шире диапазона целых чисел. Положительные и отрицательные числа расположены симметрично относительно нуля, значит, равны между собой по модулю.
Наименьшее по абсолютной величине число равно нулю. Наибольшее по абсолютной величине число в формате с плавающей точкой – это число с самой большой мантиссой и самым большим порядком.
Так как количество разрядов для представления мантиссы в памяти компьютера ограничено, то она в ряде случаев оказывается «обрезанной», т. е. дающей приближенное значение. Точное представление в компьютере имеет лишь дискретное конечное множество вещественных значений. Континуум действительных чисел отражается в машинном представлении на дискретное конечное множество.
Расстояние между двумя последовательными значениями на этом множестве зависит от количества разрядов, выделяемых под представление числа. Например, если под мантиссу выделяется 23 разряда, то следующее значение получается путем прибавления к мантиссе величины 2-23., а если 52 разряда, то – 2-52 .
Объясним, почему в случае:
float f=3123456.621f;
printf ("f= %f| f = %4.2f| f = %6.1f|\n", f, f, f);
Дата: 2019-05-28, просмотров: 220.