Программирование >>  Аргументация конструирования 

1 ... 4 5 6 [ 7 ] 8 9 10 ... 108


Объявление/шз/шх/(амое пе/иишмых

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

х = 1; х = 2 . 3

х = Это - предложение.

х = Техас

Но не настолько гибкий язык. (С другой стороны, C++ очень легко может

справиться с совершеппо пепосильпыми для пас задачами. Например, ему ничего не стоит сложить миллион чисел всего за одну секунду5.) В C + + переменные могут хра нить значения только одного типа. Причиной тому является большая разница в размерах памяти, необходимой для хранения значений переменных разных типов. Если некоторые данные программы могут состоять всего из одного числа, то довольно часто разработчикам приходится манипулировать целыми предложениями.

Добавлю, что особенности использования переменных разных типов различны. Пока вы встречались только с переменными типа ir.t:

int х; х = 1;

В C++ тип int определяет множество целых чисел. Напомню, что целым называется число, не имеющее дробной части.

Целые числа используют для самых разных видов вычислений. Детально этому учат в младшей школе, приблизительно до шестого класса, и лишь потом начинается путаница с дробями6. Та же тенденция характерна и для C + + , в котором более 90% всех переменных имеют тип int7.

К сожалению, иногда использование в программах переменных типа ir.t приводит к ошибочным результатам. Когда в первой главе вы работали с программой,

преобразующей температуру, существовала (пусть неявно) проблема: программа

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

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

достичь ее невозможно.

Ограничения, налагаемые на целые числа вС++

Целочисленные переменные в C++ представляются типом На перемен-

ные этого типа накладываются те же ограничения, что и на их эквиваленты в математике.

Заметим, что складывает числа не язык, а компьютер - язык только передает ему задание. - Прим. ред.

Автор имеет в виду американскую школу; впрочем, современные тенденции в отечественной школе примерно те же. - Прим. ред.

Эта величина опять-таки существенно зависит от типа разрабатываемой программы. - Прим. ред.



Округление до целых значений

Рассмотрим проблему вычисления среднего трех чисел. Введем три целочисленные пере\е}1ные - nValuel, nVal;:e2, nValueS. Среднее значение вычисляется но

формуле

(nValuelf nValue2 1иеЗ) / 3

Поскольку все три значения являются целыми, их сума тоже будет целым числом. Например, сумма чисел I, 2 и 2 равна 5. Но если 5 поделить на 3, получив или 1,666....

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

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

дробную часть. При этом 1,666 утратит свой дьявольский остаток и превратится в 1.

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

эквивалентную приведенной выше формулу:

nValuel/;. + nValue2/3 + nValue3/3

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

Ограничения диапазона

Второй проблемой переменной типа int является ограниченный диапазон возможных ее значений. Максимальным значением обычной целочисленной переменной является число 2 147 483 647, минимальным--2 147 483 648, т.е. общий диапазон -

около 4 млрд чисел8.

Решение проблемы усечения дробной части

Рассмотренные особенности переменных типа int делают невозможным их использование в некотор1х приложениях. Но, к счастью, C++ умеет работать и с десятичными числами, которые могут иметь ненулевую дробную часть (математики называют их действительными числами). Используя действительные числа, можно избежать

большинства перечисленных проблем. Заметьте, что десятичные числа могут иметь ненулевую дробную часть, а могут и не иметь, оставаясь действительными. В C++

число 1.0 является таким же действительным числом, как и 1.5. Эквивалентным им целым числом является просто 1.

В C + + действительные числа определены как числа с плавающей точкой, или просто float. Используя выражение с плавающей точкой , имеют в виду, что десятичную запятую (или используемую вместо нее в программах точку) в десятичных числах можно перемешать вперед и назад настолько, насколько этого требуют вычисления. Действительные переменные объявляются так же, как и переменные типа int:

float fValue;

Вообще говоря, диапазон представимых типом inmenuu определяется множеством факторов - в первую очередь компилятором, на выбор типа int которого оказывает огромное влияние тип компьютера, поэтому считать определенным раз и навсегда, что диапазон значений int простирается от -2 до +2-1, нельзя. - Прим. ред.



Начиная с этой строки, во всей остальной части программы переменная fValue может принимать значения типа float. Тип уже объявленной переменной изменить нельзя: fValue является действительной переменной и останется ею до конца программы. Рассмотрим, как решается присущая целочисленным переменным проблема

отбрасывания дробной части. Для этого в объявлении все переменные определим как

действительные (тип float): 1/3 + 2/3 + 2/3

Это эквивалентно выражению

0.333... 66.. . + 0.666. . ., которое равно 1.666...

Ограничения, налагаемые на числа с плавающей точкой

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

Перечисление

Использовать переменные с плавающей точкой для простого перечисления нельзя. C++ не умеет определять, какое целочисленное значение подразумевается под действительным числом.

Например, ясно, что 1.0 есть 1. Но что такое 0.9 или 1.1? Следует ли их рассматривать как 1? Так что C + + избегает многих проблем, требуя использовать при перечислении только целые значения.

Скорость вычислений

Исторически сложилось так, что процессор компьютера выполняет операции с целыми числами гораздо быстрее, чем с действительными. Для сложения 1000 целых

чисел процессору может потребоваться столько же времени, сколько для выполнения только 200 вычислений с плавающей точкой.

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

Потеря точности

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

Чтобы понять эту проблему, представим 1/3 в виде бесконечной последовательности 0.333.... Однако математическое понятие периода в программировании не имеет

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

значение 1. 666667.



1 ... 4 5 6 [ 7 ] 8 9 10 ... 108

© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки.
Яндекс.Метрика