Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
algorithms.doc
Скачиваний:
29
Добавлен:
06.12.2018
Размер:
9.73 Mб
Скачать
  1. Лекция 1

    1. Представление чисел в эвм

      1. Целые

Беззнаковые целые.

Используется двоичное представление чисел.

x = an-1*2n-1 + an-2*2n-2 + … a1*21 + a0*20

здесь каждый член ai представляет собой 0 или 1 или, иначе говоря, одну цифру в двоичном представлении данных.

n задается количеством бит (в одном бите хранится одна двоичная цифра), отводящихся под данное число.

BCD - Binary Coded Decimal

В одном байте хранятся две цифры десятичного представления. Применяется, например, в СУБД Oracle для хранения вещественных чисел с плавающей точкой.

Целые со знаком.

Существует три основных формата:

  • прямой (старший бит служит признаком знака: 1=’-‘; 0=’+’)

  • обратный (для представления отрицательного числа берется представление его модуля, а потом все биты инвертируются)

  • дополнительный (для представления отрицательного числа берется представление его модуля, все биты инвертируются, к результату прибавляется 1)

Реально, в основном, используется только дополнительный код.

Утверждение 1. Представление чисел в дополнительном коде эквивалентно представлению чисел в кольце вычетов по модулю 2n, где n – количество бит в двоичном представлении числа.

Следствие. Операции сложения, вычитания и умножения корректно производятся независимо от способа интерпретации целых чисел – дополнительного кода (для знакового целого) или беззнакового целого.

      1. Вещественные

Вещественные числа с фиксированной запятой.

VB тип Currency - восьмибайтовая переменная, которая содержит вещественное число в формате с фиксированной десятичной запятой (четыре десятичных знака после запятой).

C# тип decimal

Вещественные числа с плавающей запятой.

Формат закреплен IEEE: Institute of Electrical and Electronics Engineers.

Число представляется в виде

x = s * m * 2d

где

s – знак (отводится один бит)

m – мантисса в виде 1.xxxxx (где x – двоичная цифра; 1 не хранится)

d – степень (оставшиеся биты)

Согласно формату IEEE вместо степени хранится характеристика = d-dmin , где dmin – минимально возможное значение мантиссы. Таким образом, минимально возможное значение характеристики = 0.

На самом деле, по стандарту IEEE представление более сложное. Пока характеристика положительна поддерживается вышеуказанное представление. Для нулевой характеристики число хранится уже как число с фиксированное запятой в виде

x = p * 2-dmin

где p – число с фиксированной точкой в виде x.xxxxx (где x – двоичная цифра; хранятся все указанные биты!).

Таким образом, отрицательные степени двойки будут иметь битовое представление (степень выделена пробелами):

2-122: 1.88079e-037: 0 00000101 00000000000000000000000

2-123: 9.40395e-038: 0 00000100 00000000000000000000000

2-124: 4.70198e-038: 0 00000011 00000000000000000000000

2-125: 2.35099e-038: 0 00000010 00000000000000000000000

2-126: 1.17549e-038: 0 00000001 00000000000000000000000

2-127: 5.87747e-039: 0 00000000 10000000000000000000000

2-128: 2.93874e-039: 0 00000000 01000000000000000000000

2-129: 1.46937e-039: 0 00000000 00100000000000000000000

2-130: 7.34684e-040: 0 00000000 00010000000000000000000

2-131: 3.67342e-040: 0 00000000 00001000000000000000000

2-132: 1.83671e-040: 0 00000000 00000100000000000000000

2-133: 9.18355e-041: 0 00000000 00000010000000000000000

2-134: 4.59177e-041: 0 00000000 00000001000000000000000

2-135: 2.29589e-041: 0 00000000 00000000100000000000000

2-136: 1.14794e-041: 0 00000000 00000000010000000000000

2-148: 5.73972e-042: 0 00000000 00000000000000000000010

2-149: 2.86986e-042: 0 00000000 00000000000000000000001

2-150: 1.43493e-042: 0 00000000 00000000000000000000000

Здесь следует отметить, что в Intel-архитектуре байты переставлены в обратном порядке и в вышеописанном представлении байты выводятся в порядке: 3, 2, 1, 0.

Т.о. число 2-150 уже неотличимо от 0.Если вышеуказанные число получались каждый раз путем деления предыдущего числа на 2, то в результате получения последнего число из 2-149 мы получили ситуацию underflow – нижнее переполнение. Как правило, процессоры могут отслеживать underflow, но нижнее переполнение можно расценивать как ошибку, а можно и не расценивать, ведь при многих вычислениях слишком маленькие числа можно расценивать как нулевые. Поэтому, обычно никаких сообщений в ситуации underflow не производится.

Переполнение при увеличении чисел называется overflow. При увеличении чисел с плавающей точкой степень увеличивается до максимально возможной. Когда степень достигает максимально возможного значения, то подобное число уже числом не считается, независимо от значения бит мантиссы:

2-118: 3.32307e+035: 0 11110101 00000000000000000000000

2-119: 6.64614e+035: 0 11110110 00000000000000000000000

2-120: 1.32923e+036: 0 11110111 00000000000000000000000

2-121: 2.65846e+036: 0 11111000 00000000000000000000000

2-122: 5.31691e+036: 0 11111001 00000000000000000000000

2-123: 1.06338e+037: 0 11111010 00000000000000000000000

2-124: 2.12676e+037: 0 11111011 00000000000000000000000

2-125: 4.25353e+037: 0 11111100 00000000000000000000000

2-126: 8.50706e+037: 0 11111101 00000000000000000000000

2-127: 1.70141e+038: 0 11111110 00000000000000000000000

2-128: 1.#INF : 0 11111111 00000000000000000000000

2-129: 1.#INF : 0 11111111 00000000000000000000000

2-130: 1.#INF : 0 11111111 00000000000000000000000

Итак, стандартом IEEE закреплено наличие дополнительных констант:

NAN – not a number. Не число = 0/0 [ (0111 1111)(1100 0000) 0…0]

+INF – плюс бесконечность [ (0111 1111)(1000 0000) 0…0]

-INF – минус бесконечность [ (1111 1111)(1000 0000) 0…0]

+0 = 0x00 00 00 00

-0 = 0x80 00 00 00

+INF, -INF,+0, -0 можно корректно сравнивать. +0 = = -0 = = 0.

NAN при сравнении возвращает ложь всегда кроме !=. В этом случае возвращается истина.

Для IBM PC:

float (32bit)

1bit – знак

8bits – степень+127 (127=27-1)

23bits – символы xxxxx из мантиссы (мантисса в виде 1.xxxxxx)

пример 1.f=

0 = знак

01111111 = степень+127 (занимает 8 бит)

0000…0 = символы xxxxx из мантиссы (мантисса в виде 1.xxxxxx)

Итого: 00111111 10000000 00000000 00000000

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

doudle (64bit)

1bit – знак

11bits – степень+210-1

42bits – символы xxxxx из мантиссы (мантисса в виде 1.xxxxxx)

пример 1.f=

00111111 11110000 00000000 00000000 00000000 00000000 00000000 00000000

long double (80bit)

1bit – знак

15bits – степень+214-1

64bits – символы 1xxxxx из мантиссы (мантисса в виде 1.xxxxxx)

В некоторых версиях языка С тип long double присутствует, но является всего лишь синонимом типа double (например, в текущей версии Microsoft C это именно так).

Надо всегда иметь в виду, что выше описан стандарт представления вещественных чисел с плавающей точкой, который поддерживается на архитектуре используемых персональных компьютеров (Intel/AMD), но существуют и другие (нестандартные) реализации вещественных чисел с плавающей точкой.

Например, IBM-формат вещественных чисел с плавающей точкой предполагает, что число представляется в виде: x = s * m * 16d. Подобный подход расширяет диапазон возможных значений числа, но уменьшает точность представления чисел. Кроме того, данный подход требует хранения всех бит мантиссы (в стандартном представлении старший бит всегда равен 1 и поэтому он не хранится в машинном представлении числа). Числа в данном формате не меняют своего представления для очень маленьких и очень больших по модулю чисел, что упрощает реализацию алгоритмов работы с такими числами. При этом нет проблем с представлением нуля: нулевая мантисса всегда соответствует числу, равному нулю. Данный формат представления чисел до сих пор используется, например, при представлении сейсмических данных в геологической разведке.

Даже в Intel-архитектуре представления вещественных чисел могут присутствовать отклонения от стандарта. Так, 80-битные вещественные числа обычно используются для представления вещественных чисел в родном Intel-формате чисел, с которыми, собственно, работает процессор (тут следует отметить, что в зависимости от установок процессора 80-битные вещественные числа, вообще говоря, могут интерпретироваться процессором по-разному). В этом формате старший бит мантиссы обычно не изымается из машинного представления вещественного числа, что несколько уменьшает возможную точность представления вещественного число, в обмен на более простые алгоритмы работы с такими числами.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]