Чтобы понять эту проблему, представим 1/3 в виде бесконечной последовательности 0.333.... Однако математическое понятие периода в программировании не имеет смысла, так как точность компьютерных вычислений ограничена и где-то наша дробь должна оборваться ( что зависит от использованного для хранения числа типа переменной ). Поэтому, усреднив числа 1, 2, 2, мы получим не точное, а приблизительное значение 1.666667.
В некоторых случаях ошибки округления может исправлять сам С++; например, выводя информацию на экран, вместо числа 0.999999 С++ выдаст пользователю значение 1.
Ограниченность диапазона...45
Тип данных double также ограничен, хотя его диапазон намного обширнее диапазона целочисленных переменных. Максимальным значением типа int является число чуть больше 2 млрд.; максимальное значение переменной типа double приблизительно равно 10308, т.е. 1 с 308 нулями[ 7 ].
«Представляя переменные с плавающей точкой в стандартном виде, С++ учитывает после десятичной точки только первые 13 разрядов. Остальные 25 разрядов становятся жертвами ошибочных округлений.»
[Атас!]
►Объявления типов переменных...45
Вы уже знаете, что все переменные в программе должны быть объявлены и что им должен быть назначен тип. Однако в С++ имеется масса различных типов. В табл. 2.1 представлен список некоторых стандартных типов переменных языка С++ с указанием их достоинств и недостатков.
________
7Это не означает, будто тип double может представить 1038 разных значений; вспомните, что говорилось выше о количестве разрядов в числах этого типа. — Прим. ред.
_________________
45 стр. Глава 2. Премудрости объявления переменных
Таблица 2.1. Переменные С++
_________________
Переменная — Пример — Характеристика
¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯
int — 1 — Простые положительные или отрицательные числа, используемые для перечисления .
unsigned — 1U — Неотрицательные числа, предназначенные в первую очередь для перечислений.
long — 10L — Потенциально расширенная версия типа int. В Dev-C++ и Microsoft Visual С++ .NET разницы между типами long и int нет.
unsigned long —10UL — Неотрицательная версия типа long.
float — 1.0F — Действительные числа единичной точности. Это уменьшенная версия double , требующая меньшего количества памяти, но при этом имеющая меньшую точность и диапазон возможных значений.
double — 1.0 — Стандартное представление чисел с плавающей точкой.
char — c — Символьный тип; значением переменных может быть символ алфавита, цифра, знак препинания или знак арифметической операции. Не годится для арифметических операций.
string — "this is a string" — Строка символов, составляющая предложение.
bool — true — Тип имеет только два логических значения — true и false ( истина и ложь ).
¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯
Может показаться странным, что основным типом для действительных чисел является тип двойной точности, а не одинарной. Тому есть исторические причины — уходящие корнями в те времена, когда Большой Билл утверждал, что 640 Кбайт памяти хватит всем и всегда, а экономия памяти и повышение скорости вычислений за счёт точности представлялась разумной мерой. С удешевлением памяти и наращиванием мощности процессоров ( которые теперь работают с типом float с той же скоростью, что и с double ) тип double стал стандартом для чисел с плавающей точкой.
Следующий оператор объявляет переменные lVariable типа long и dVariable типа double и присваивает им начальные значения:
/* объявление переменной типа long и установка её равной 1 */
long lVariable ;
lVariable = 1
/* объявление переменной типа double и её инициализация */
7
Это не означает, будто тип