Данные с плавающей точкой
Язык Borland C++ поддерживает операции с плавающей точкой. Особенностью персональных компьютеров IBM PC является отсутствие в системе команд микропроцессора Intel, на базе которых они построены, операций над числами с плавающей точкой. Такие арифметические операции выполняет либо специальный сопроцессор математики с плавающей точкой (сопроцессоры 8087/80287/80387), либо при его отсутствии специальные стандартные подпрограммы (программная эмуляция сопроцессора).
Компилятор использует три формы внутреннего представления данных с плавающей точкой (табл.3).
Таблица 3
Данные с плавающей точкой для компилятора Borland C++ 3.1
Тип | Размер, бит | Диапазон представления чисел(abs) | Точность (десятичных цифр) | |
Максимум | минимум | |||
Float Double Long double | 3.4*10-38 1.7*10-308 3.4*10-4932 | 3.4*1038 1.7*10308 3.4*104932 | 19 |
Borland C++ поддерживает IEEE-стандарт, в соответствии с которым такие данные представляются в виде двух частей – мантиссы М и порядка Р числа в двоичной системе счисления:
С = М * 2Р
Число бит для хранения мантиссы и порядка зависит от типа данных с плавающей точкой (рис. 2).
float: | S | P | M | ||||
30 23 | 22 0 | ||||||
double: | S | P | M | ||||
62 52 | 51 0 | ||||||
long double: | S | P | M | ||||
78 64 | 63 0 | ||||||
S – знак числа (0 – для положительных, 1 – для отрицательных);
Р – сдвинутый порядок числа;
М – мантисса числа.
Рис. 2. IЕЕЕ-стандарт внутреннего представления данных с плавающей точкой.
Вещественное число в памяти хранится с нормализованной мантиссой. При нарушении нормализации мантиссу сдвигают влево до тех пор, пока старшей цифрой мантиссы не станет 1. Каждая операция сдвига сопровождается уменьшением порядка на 1. Но если мантисса всегда нормализована, то старшую единицу можно и не хранить в памяти. Это экономит один бит и, следовательно, увеличивает точность представления вещественных чисел. Эта единица присутствует неявно и называется неявной единицей (implicit one). Отбрасывание старшей цифры мантиссы выполняется для форматов float и double, но не выполняется для long double.
Порядок числа хранится "сдвинутым", т. е. к нему прибавляется число так, чтобы порядок был всегда неотрицательным. Для чисел формата float прибавляется 127, для чисел формата double - 1023, для чисел формата long double -16383. Всегда неотрицательный порядок избавляет от необходимости выделять один бит для хранения знака порядка и упрощает выполнение операций сравнения порядков и арифметических операций над ними.
Например, число 15.375 (1111.011 в двоичной системе счисления) в формате float IEEE-стандарта записывается так:
1.111011*211.
Учитывая отбрасывание неявной единицы и сдвиг порядка, получаем внутреннее представление числа:
S = 0;
Р = 3+127 = 130(1000.0010 в двоичной системе счисления);
М = 1110110...0.
Переменные с плавающей точкой описываются с использованием спецификаторов типа float, double, long double.
Причина того, что представляется более чем один целый тип, более чем один беззнаковый тип и более чем один тип с плавающей точкой в том, чтобы дать возможность программисту воспользоваться характерными особенностями аппаратного обеспечения. На многих машинах между различными разновидностями основных типов существуют значительные различия в потребностях в памяти, временах доступа к памяти и временах вычислений. Размеры типов не указаны в стандарте языка а зависят от операционной системы, компилятора и разрядности процессора. В компьютерах с 16-ти разрядными процессорами int – 2 байта, в компьютерах с 32-х разрядными процессорами – 4 байта и т.д. В стандарте языка С++ указаны следующие соотношения относительно размеров основных типов:
I = = sizeof (char) < = sizeof(short) < = sizeof(int) < = sizeof(long)
sizeof (float) < = sizeof(double)
Однако обычно разумно предполагать, что в char могут храниться целые числа в диапазоне 0…127, что short и int имеют не менее 16 битов, что int имеет, по меньшей мере, 24 бита.
Беззнаковые (unsigned) целые типы идеально подходят для применений, в которых память рассматривается как массив битов.
Константы
С++ дает возможность записи значений основных типов: символьных констант, целых констант и констант с плавающей точкой. Кроме того, нуль (0) может использоваться как константа любого указательного типа, и символьные строки являются константами типа char[]. Можно также задавать символические константы. Символическая константа - это имя, значение которого не может быть изменено в области его видимости. В С++ имеется три механизма определения символических констант: 1) любому значению любого типа можно дать имя и использовать его как константу, добавив к его описанию ключевое слово const; 2) множество целых констант может быть определено как перечисление; 3) любое имя массива или функции является константой.
Целые константы
Целые константы предстают в четырех "обличиях": десятичные, восьмеричные, шестнадцатиричные и символьные константы. Десятичные используются чаще всего и выглядят так:
0 1234 5768595974474736
Десятичная константа имеет тип int, при условии, что она "влезает" в int, в противном случае ее тип – long суффикс L или l явно указывает компилятору, что тип константы – long, например 314564L или 3254354l. Компилятор должен предупреждать о константах, которые слишком длинны для представления в машине.
Константа, начинающаяся нулем, за которым идет x (0x), является шестнадцатеричным числом, а константа, начинающаяся нулем, за которым идет цифра, является восьмеричным числом. Например:
0 02 045 09786 07564 / / восьмеричные константы
0x0 0x6 0x3f 0x56 / / шестнадцатеричные константы
Дата добавления: 2017-01-29; просмотров: 874;