Главная страница
Навигация по странице:

  • 2. Формат с плавающей запятой

  • Криптографические методы защиты информации. Лекция Криптографические методы защиты информации Кодирование информации


    Скачать 0.84 Mb.
    НазваниеЛекция Криптографические методы защиты информации Кодирование информации
    Дата18.11.2021
    Размер0.84 Mb.
    Формат файлаdoc
    Имя файлаКриптографические методы защиты информации.doc
    ТипЛекция
    #275484
    страница5 из 6
    1   2   3   4   5   6

    1. Формат с фиксированной запятой, в основном, применяется для целых чисел, но может применяться и для вещественных чисел, у которых фиксировано количество десятичных знаков после запятой. Для целых чисел подразумевается, что «запятая» находится справа после младшего бита (разряда), т.е. вне разрядной сетки. В данном формате существуют два представления: беззнаковое (для неотрицательных чисел) и со знаком.

    Для беззнакового представления все разряды отводятся под представление самого числа. Например, с помощью байта можно представить беззнаковые целые числа от 010 до 25510 (000000002 - 111111112) или вещественные числа с одним десятичным знаком от 0.010 до 25.510 (000000002 - 111111112). Для знакового представления, т.е. положительных и отрицательных чисел, старший разряд отводится под знак (0 – положительное число, 1 – отрицательное).

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

    В прямом коде запись положительного и отрицательного числа выполняется так же, как и в беззнаковом представление (за исключение того, что старший разряд отводится под знак). Таким образом, числа 510 и -510 записываются, как 000001012 и 100001012. В прямом коде имеются два кода числа 0: «положительный нуль» 000000002 и «отрицательный нуль» 100000002.

    При использовании обратного кода отрицательное число записывается в виде инвертированного положительного числа (0 меняются на 1 и наоборот). Например, числа 510 и -510 записываются, как 000001012 и 111110102. Следует отметить, что в обратном коде, как и в прямом, имеются «положительный нуль» 000000002 и «отрицательный нуль» 111111112. Применение обратного кода позволяет вычесть одно число из другого, используя операцию сложения, т.е. вычитание двух чисел X – Y заменяется их суммой X + (-Y). При этом используются два дополнительных правила:

    - вычитаемое число инвертируется (представляется в виде обратного кода);

    - если количество разрядов результата получается больше, чем отведено на представление чисел, то крайний левый разряд (старший) отбрасывается, а к результату добавляется 12.

    В следующей таблице приведены примеры вычитания.

    Таблица 22.2. Примеры вычитания двух чисел с использованием обратного кода

    X – Y

    5 – 5

    6 – 5

    5 – 6

    5 – (-6)

    X2

    00000101

    00000110

    00000101

    00000101

    Y2

    00000101

    00000101

    00000110

    11111001

    Замена сложением

    5 + (-5)

    6 + (-5)

    5 + (-6)

    5 + 6

    Обратный код для вычитаемого (-Y2)

    11111010

    11111010

    11111001

    00000110

    Сложение

       00000101
    +
       11111010
       11111111

       00000110
    +
       11111010
      100000000

       00000101
    +
       11111001
       11111110

       00000101
    +
       00000110
       00001011

    Отбрасывание старшего разряда и добавление 12

    не требуется

       00000000
    +
       00000001
       00000001

    не требуется

    не требуется

    Результат

    -0

    1

    -1

    11

     

    Несмотря на то, что обратный код значительно упрощает вычислительные процедуры, а соответственно и быстродействие компьютеров, наличие двух «нулей» и другие условности привели к появлению дополнительного кода. При представлении отрицательного числа его модуль вначале инвертируется, как в обратном коде, а затем к инверсии сразу добавляется 12.

    В следующей таблице приведены некоторые числа в различном кодовом представлении.

    Таблица 22.3. Представление чисел в различных кодах

    Десятичное
    представление

    Код двоичного представления (8 бит)

    прямой

    обратный

    дополнительный

    127

    01111111

    01111111

    01111111

    6

    00000110

    00000110

    00000110

    5

    00000101

    00000101

    00000101

    1

    00000001

    00000001

    00000001

    0

    00000000

    00000000

    00000000

    -0

    10000000

    11111111

    ---

    -1

    10000001

    11111110

    11111111

    -5

    10000101

    11111010

    11111011

    -6

    10000110

    11111001

    11111010

    -127

    11111111

    10000000

    10000001

    -128

    ---

    ---

    10000000

     

    При представлении отрицательных чисел в дополнительных кодах второе правило несколько упрощается - если количество разрядов результата получается больше, чем отведено на представление чисел, то только отбрасывается крайний левый разряд (старший).

    Таблица 22.4. Примеры вычитания двух чисел с использованием дополнительного кода

    X – Y

    5 – 5

    6 – 5

    5 – 6

    5 – (-6)

    X2

    00000101

    00000110

    00000101

    00000101

    Y2

    00000101

    00000101

    00000110

    11111010

    Замена сложением

    5 + (-5)

    6 + (-5)

    5 + (-6)

    5 + 6

    Дополнительный код для вычитаемого (-Y2)

    11111011

    11111011

    11111010

    00000110

    Сложение

       00000101
    +
       11111011
       00000000

       00000110
    +
       11111011
      100000001

       00000101
    +
       11111010
       11111111

       00000101
    +
       00000110
       00001011

    Отбрасывание старшего разряда и добавление 12

    не требуется

    00000001

    не требуется

    не требуется

    Результат

    -0

    1

    -1

    11

     

    Можно возразить, что представление чисел в дополнительных кодах требует на одну операцию больше (после инверсии всегда требуется сложение с 12), что может и не потребоваться в дальнейшем, как в примерах с обратными кодами. В данном случае срабатывает известный «принцип чайника». Лучше сделать процедуру линейной, чем применять в ней правила «Если A то B» (даже если оно одно). То, что с человеческой точки зрения кажется увеличением трудозатрат (вычислительной и временной сложности), с точки зрения программно-технической реализации может оказаться эффективней.

    Еще одно из преимуществ дополнительного кода перед обратным заключается в возможности представления в единице информации на одно число (состояние) больше, за счет исключения «отрицательного нуля». Поэтому, как правило, диапазон представления (хранения) для знаковых целых чисел длиной один байт составляет от +127 до -128.

    2. Формат с плавающей запятой, в основном, используется для вещественных чисел. Число в данном формате представляется в экспоненциальном виде

    X = en * m,          (22.1)

    где e - основание показательной функции;
    n - порядок основания;
    en - характеристика числа;
    m - мантисса (лат. mantissa - прибавка) – множитель, на который надо умножить характеристику числа, чтобы получить само число.

     

    Например, число десятичное число 350 может быть записано, как 3.5 * 102, 35 * 101, 350 * 100 и т.д. В нормализованной научной записи, порядок n выбирается такой, чтобы абсолютная величина m оставалась не меньше единицы, но строго меньше десяти (1 ? |m| < 10). Таким образом, в нормализованной научной записи число 350 выглядит, как 3.5 * 102. При отображении чисел в программах, учитывая, что основание равно 10, их записывают в виде m E ± n, где Е означает «*10^» («…умножить на десять в степени…»). Например, число 350 – 3.5Е+2, а число 0.035 – 3.5Е-2.

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

    b

    bn7

    bn6

    bn5

    bn4

    bn3

    bn2

    bn1

    b

    bm15

    bm14

    bm13

    bm12

    bm11

    bm10

    bm9

    bm8

    bm7

    bm6

    bm5

    bm4

    bm3

    bm2

    bm1

    знак

    величина

    знак

    величина

    порядок

    мантисса

    Рис. 22.9. Двоичный формат представления чисел с плавающей запятой

    Биты bn± и bm±, означающие знак порядка и мантиссы, кодируются аналогично числам с фиксированной запятой: для положительных чисел «0», для отрицательных – «1». Значение порядка выбирается таким образом, чтобы величина целой части мантиссы в десятичном (и соответственно в двоичном) представлении равнялась «1», что будет соответствовать нормализованной записи для двоичных чисел. Например, для числа 35010 порядок n = 810 = 0010002(350 = 1.3671875 * 28), а для 57610 – n = 910 = 0010012 (576 = 1.125 * 29). Битовое представление величины порядка может быть выполнено в прямом, обратном или дополнительном коде (например, для n = 810 бинарный вид 0010002). Величина мантиссы отображает дробную часть. Для ее преобразования в двоичный вид, она последовательно умножается на 2, пока не станет равной 0. Например,



    Рис. 22.10. Пример получения дробной части в бинарном виде

    Целые части, получаемые в результате последовательного перемножения, и представляют собой двоичный вид дробной части (0.367187510 = 01011112). Оставшаяся часть разрядов величины мантиссы заполняется 0. Таким образом, итоговый вид числа 350 в формате с плавающей запятой с учетом представления мантиссы в нормализованной записи

    0

    0

    0

    0

    1

    0

    0

    0

    0

    0

    1

    0

    1

    1

    1

    1

    0

    0

    0

    0

    0

    0

    0

    0

    знак
    +

    величина
    28

    знак
    +

    величина
    (1) + 0.3671875

    порядок

    мантисса

    Рис. 22.11. Двоичный вид числа 350

    В программно-аппаратных реализациях арифметических действий широко распространен стандарт представления чисел с плавающей точкой IEEE2 754 (последняя редакция «754-2008 - IEEE Standard for Floating-Point Arithmetic»). Данный стандарт определяет форматы с плавающими запятыми для представления чисел одинарной (англ. single, float) и двойной (англ. double) точности. Общая структура форматов

    b

    bni

              ...          

    bn1

    bmj

              ...          

    bm1

    знак
    мантиссы

    порядок

    величина
    мантиссы

    Рис. 22.12. Общий формат представления двоичных чисел в стандарте IEEE 754

    Форматы представления отличаются количеством бит (байт), отводимым для представления чисел, и, соответственно, точностью представления самих чисел.

    Таблица 22.5. Характеристики форматов представления двоичных чисел в стандарте IEEE 754

    Формат

    single

    double

    Общий размер, бит (байт)

    32 (4)

    64 (8)

    Число бит для порядка

    8

    11

    Число бит для мантиссы
    (без учета знакового бита)

    23

    52

    Величина порядка

    2128 .. 2-127
    (±3.4 * 1038 .. 1.7 * 10-38)

    21024 .. 2-1023
    (±1.8 * 10308 .. 9.0 * 10-307)

    Смещение порядка

    127

    1023

    Диапазон представления чисел
    (без учета знака)

    ±1.4 * 10-45 .. 3.4 * 1038

    ±4.9 * 10-324 .. 1.8 * 10308

    Количество значащих цифр числа
    (не более)

    8

    16

     

    Особенностью представления чисел по стандарту IEEE является отсутствие бита под знак порядка. Несмотря на это, величина порядка может принимать как положительные значения, так и отрицательные. Этот момент учитывается т.н. «смещением порядка». После преобразования двоичного вида порядка (записанного в прямом коде) в десятичный от полученной величины отнимается «смещение порядка». В результате получается «истинное» значения порядка числа. Например, если для числа одинарной точности указан порядок 111111112 (= 25510), то величина порядка на самом деле 12810 (= 25510 - 12710), а если 000000002 (= 010), то -12710 (= 010 - 12710).

    Величина мантиссы указывается, как и в предыдущем случае, в нормализованном виде.

    C учетом вышеизложенного, число 35010 в формате одинарной точности стандарта IEEE 754 записывается следующим образом.

    0

    1

    0

    0

    0

    0

    1

    1

    1

    0

    1

    0

    1

    1

    1

    1

    0

    0

    0

    0

    0

    0

    0

    0

    0

    0

    0

    0

    0

    0

    0

    0

    знак
    мантиссы
    +

    порядок
    28 (8 = 135 - 127)

    величина мантиссы
    (1) + 0.3671875

    Рис. 22.13. Двоичный вид числа 350 по стандарту IEEE

    К другим особенностям стандарта IEEE относится возможность представления специальных чисел. К ним относятся значения NaN (англ. Not a Number - не число) и +/-INF (англ. Infinity - бесконечность), получающихся в результате операций типа деления на ноль. Также сюда попадают денормализованные числа, у которых мантисса меньше единицы.

    В заключение по числам с плавающей запятой несколько слов о пресловутой «ошибке округления». Т.к. в двоичной форме представления числа хранится только несколько значащих цифр, она не может «покрыть» все многообразие вещественных чисел в заданном диапазоне. В результате, если число невозможно точно представить в двоичной форме, оно представляется ближайшим возможным. Например, если к числу типа double «0.0» последовательно добавлять «1.7», то можно обнаружить следующую «картину» изменения значений.

    0.0
    1.7
    3.4
    5.1
    6.8
    8.5
    10.2
    11.899999999999999
    13.599999999999998
    15.299999999999997
    16.999999999999996
    18.699999999999996
    20.399999999999995
    22.099999999999994
    23.799999999999994
    25.499999999999993
    27.199999999999992
    28.89999999999999
    30.59999999999999
    32.29999999999999
    33.99999999999999
    35.699999999999996
    37.4
    39.1
    40.800000000000004
    42.50000000000001
    44.20000000000001
    45.90000000000001
    47.600000000000016


    Рис. 22.14. Результат последовательного добавления числа 1.7 (Java 7)

    Другой нюанс обнаруживается при сложении двух чисел, у которых значительно отличается порядок. Например, результатом сложения 1010 + 10-10 будет 1010. Даже если последовательно триллион (1012) раз добавлять 10-10 к 1010, то результат останется прежним 1010. Если же к 1010 добавить произведение 10-10 * 1012, что с математической точки зрения одно и то же, результат станет 10000000100 (1.0000000100 * 1010).
    1   2   3   4   5   6


    написать администратору сайта