Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Итог_Пособие C++.doc
Скачиваний:
8
Добавлен:
01.07.2025
Размер:
2 Мб
Скачать
☆

1.2.3 Внутреннее представление простых типов

В современных компьютерных архитектурах имеется две основных формы представления данных:

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

  • с плавающей точкой (запятой).

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

В представлении с фиксированной точкой целое число хранится в двоичной системе счисления, занимая столько байт памяти, сколько определено для его типа.

Например, целое число 19 в двоичной форме с фиксированной точкой будет записано как 10011 (разложение по степеням двойки: 19=1×24+0×23+0×22+1×21+1×20). В типах signed один крайний бит отводится под знак (0 для положительного числа, 1 для отрицательного). Остальные незанятые биты заполняются нулями.

Зная размер целого типа данных, несложно определить диапазон его допустимых значений: если тип занимает k бит, то количество различных значений равно 2k. При этом для знаковых типов количество отрицательных значений равно количеству неотрицательных – например, для типа int, который обычно занимает 32 бита, диапазон значений получается от -231 до 231-1, то есть от -2147483648 до 2147483647 (на практике обычно достаточно помнить, что диапазон составляет от минус двух миллиардов с небольшим до плюс двух миллиардов с небольшим). Впрочем, точные значения границ диапазонов всегда можно получить с помощью констант, определенных в заголовочном файле climits, например, INT_MIN и INT_MAX.

Представление с плавающей точкой в различных компьютерных архитектурах может быть реализовано по-разному, но в любом случае число рассматривается как произведение двух сомножителей, один из которых представляет собой число 2 в целой степени. Степень двойки определяет порядок числа, а первый из сомножителей определяет значащие цифры числа и называется мантиссой.

Например:

вещественное число 15,375 в двоичной форме с плавающей запятой можно представить как 1,111011×211, где 1,111011 — мантисса, 11 — порядок.

В ячейке памяти, отводимой под число с плавающей точкой, в действительности хранится не одно, а два значения — мантисса и порядок.

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

  • Целочисленные типы  — это интервал целых чисел. Операции над ними определены лишь тогда, когда исходные данные и результат лежат в этом интервале. Иначе возникает ситуация, называемая переполнением. При целочисленном переполнении, как правило, не возникает ошибка выполнения программы, однако результат становится неверным. За исключением переполнения все операции над аргументами с фиксированной точкой выполняются точно (без погрешности).

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

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

  • Каждое вещественное число будет иметь приблизительно одинаковое количество значащих цифр в его представлении, т. к. под мантиссу отводится фиксированное количество байтов. Как следствие этого, ошибка для очень больших чисел будет больше по абсолютной величине.

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

  • Следует быть осторожным при выполнении операций между числами, порядки которых сильно отличаются, например, между очень большими и очень маленькими числами. Возможны ситуации, когда мантисса не сможет обеспечить требуемую точность. Например, при сложении чисел 10000000 и 0.00000001 типа float разрядности мантиссы не хватит, чтобы представить число 10000000.00000001, и результат останется равным 10000000.

  • Стоит запомнить, что наиболее часто используемый тип double способен хранить 15 значащих десятичных цифр (хотя вследствие погрешностей вычислений точность последних цифр не всегда гарантируется).

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