Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лекции за I семестр конспект Гуревича для C++ B....doc
Скачиваний:
11
Добавлен:
21.11.2018
Размер:
1.3 Mб
Скачать

11.3. Кодирование вещественных чисел.

Вещественные числа также хранятся в двоичном представлении. При этом они преобразуются в т.н. нормализованную экспоненциальную форму:

x.xxx∙2P

где x.xxx называется мантиссой числа, а P - его порядком. Нормализованность означает, что величина P подбирается так, чтобы в мантиссе перед точкой осталась лишь одна значащая (ненулевая, если только само число не равно 0) цифра.

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

1.xxx∙2P

а для нулевого числа величина P не играет роли.

Нормализованное число хранится в ячейке, занимающей несколько байт. Часть бит отводится на мантиссу, а часть на порядок, которые хранятся аналогично целым числам (знак порядка учитывается при этом несколько по-другому, чем знак целых чисел - к значению порядка (со знаком + или -) прибавляется (2N-1 - 1), где N - число бит для хранения порядка. Например, в типе double порядок +2 хранится как 100000000012, а -2 -как 011111111012).

Типы вещественных чисел, поддерживаемые С++ Builder'ом:

Тип

Точность мантиссы (десятичныхцифр после запятой)

Порядок (деся-тичный)

Байт, всего

Из них бит на:

знак числа

порядок (с его знаком)

мантиссу

float

7 - 8

 38

4

1

8

23*

double

15 - 16

 308

8

1

11

52*

long double

19 - 20

 4932

10

1

15

64

* В типах float и double для экономии места первый (всегда единичный) бит мантиссы не хранится.

Как можно видеть из приведенных выше таблиц, при одинаковом количестве байт, отводимом, например, под величины типа float и long int, диапазоны их допустимых значений сильно различаются из-за внутренней формы представления значений таких данных.

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

Рекомендуется поэтому, как упоминалось выше, вместо проверки двух вещественных величин на равенство (==) или неравенство (!=) вычислять разницу между ними и сравнивать ее с заданным малым числом - допустимой погрешностью, например:

if (fabs(y-z)<0.0000001)

Отметим, что при вычислениях с веществеными числами, в отличие от целых, машина следит, чтобы операнды и результат лежали в допустимых пределах. В противном случае, либо выдается сообщение об ошибке ("Floating point overflow"), либо результату присваивается "недопустимое" значение, соответствующее недопустимому сочетанию значений мантиссы и порядка ("NAN", "INF").