Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ЛР4-С++-13 марта-2012 - копия.doc
Скачиваний:
11
Добавлен:
15.09.2019
Размер:
2.55 Mб
Скачать

1.5.9. Представление о точности

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

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

Пример 4.14

#include <iostream.h>

void main(void)

{     float f_not_half = 0.49999990;     double d_not_half = 0.49999990;     cout << "Значение типа float 0.49999990 равно " << f_not_half << endl;     cout << "Значение типа double 0.49999990 равно " << d_not_half << endl;  }

Когда вы откомпилируете и запустите эту программу, на вашем экране появится следующий вывод:

Значение типа float 0.49999990 равно 0.5

Значение типа double 0.49999990 равно 0.5

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

1.5.10. Следите за ошибками переполнения при арифметических операциях

Из раздела 1.7.7 вы узнали, что, если вы присваиваете переменной значение, которое не входит в диапазон значений для данного типа переменной, возникает ошибка переполнения. При выполнении арифметических операций необходимо помнить о возможности возникновения ошибок переполнения в процессе вычислений. Например, программа в примере 4.15 умножает 200 на 300 и присваивает результат переменной типа int. Однако, поскольку результат умножения (60000) превышает наибольшее возможное значение для типа int (32767), возникает ошибка переполнения.

Пример 4.15

#include <iostream.h>

void main(void)

{      int result;     result = 200 * 300;      cout << "200 * 300 = " << result << endl;  }

Когда вы откомпилируете и запустите эту программу, на экране появится следующий вывод:

200 * 300 = -5536

1.6. Константы

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

Символьные константы представляются отдельным симво­лом, заключенным в одинарные кавычки (апострофы): 'е', '@', '<'

Строковые константы - это последовательность символов, заключенная в двойные кавычки: "Это пример не самой длинной строковой константы!11.

Целые константы бывают следующих форматов:

■ десятичные;

■ восьмеричные:

■ шестнадцатеричные.

Десятичные могут быть представлены как последователь­ность цифр, начинающаяся не с нуля, например: 123; 2384.

Восьмеричные константы - последовательность восьмеричных цифр (от 0 до 7), начинающаяся с нуля, например: 034; 047.

Шестнадцатеричный формат констант начинается с симво­лов Ох или ОХ с последующими шестнадцатеричными цифрами (0…9.A…F), например: 0xF4; 0X5D. Буквенные символы при этом могут быть представлены в любом регистре.

Длинные целые константы, используемые в переменных типа long, определяются буквой 1 или L сразу после константы без пробела: 36L, 012L, 0x52L.

Вещественные константы - числа с плавающей запятой мо­гут быть записаны в десятичном формате (24.58; 13.0; .71) или в экспоненциальной форме (1е4; 5е+2; 2.2е-5, при этом в мантиссе может пропускаться целая или дробная часть: .2е4).

Типизованные константы используются как переменные, значение которых не может быть изменено после инициализации.

Типизованная константа объявляется с помощью ключевого слова const, за которым следует указание типа константы, но, в отличие от переменных, константы всегда должны быть инициализированы.

Символьные константы в С++ занимают в памяти 1 байт и, сле­довательно, могут принимать значения от 0 до 255 (см. табл. 4.2). При этом существует ряд символов, которые не отображаются при печати, - они выполняют специальные действия: возврат карет­ки, табуляция, и называются символами escape-последовательности. Термин мescape-последовательность" ввела компания Epson, ставшая первой фирмой, которая для управления выводом информации на своих принтерах стала использовать неотображаемые символы. Ис­торически сложилось так, что управляющие последовательности начинались с кода с десятичным значением 27 (0x1В), что соответ­ствовало символу "Escape" кодировки ASCII.

Escape-символы в программе изображаются в виде обратного слеша, за которым следует буква или символ.

Таблица 4.8.

Символы escape-последовательности

\\

Вывод на печать обратной черты

\'

Вывод апострофа

\"

Вывод при печати кавычки

\?

Символ вопросительного знака

Подача звукового сигнала

\b

Возврат курсора на 1 символ назад .

\f

Перевод страницы

\n

Перевод строки

Возврат курсора на начало текущей строки

\t

Перевод курсора к следующей позиции табуляции

\v

Вертикальная табуляция (вниз)

В качестве примера использования типизованных и литераль­ных констант вычислим значение площади круга по известному значению радиуса.

Пример 4.16.

#include <iostream.h>

int main ()

{

const double pi = 3.1415;

const int Radius = 3;

double Square =0;

Square = pi * Radius * Radius;

cout << Square << '\n';

return 0;

}

В начале главной функции программы объявляются две кон­станты: pi и Radius. Значение переменной Square изменяется в ходе выполнения программы и не может быть представлено как константа. Поскольку значение радиуса задано явно и в тексте программы не предусмотрено его изменение, переменная Ra­dius объявлена как константа.