Программирование. Принципы и практика использования C++ Исправленное издание, стр. 331
ПОПРОБУЙТЕ
Замените в примере число 333 числом 10 и снова выполните программу. Какой результат следовало ожидать? Какой результат вы получили? А ведь мы предупреждали!
Влияние фиксированного размера целых чисел может проявиться более резко. Дело в том, что числа с плавающей точкой по определению являются приближениями действительных чисел, поэтому они могут терять точность (т.е. терять самые младшие значащие биты). С другой стороны, целые числа часто переполняются (т.е. теряют самые старшие значащие биты). В итоге ошибки, связанные с числами с плавающей точкой, имеют более сложный характер (которые новички часто не замечают), а ошибки, связанные с целыми числами, бросаются в глаза (их трудно не заметить даже новичку). Мы предпочитаем, чтобы ошибки проявлялись как можно раньше, тогда их легче исправить.
Рассмотрим целочисленную задачу.
short int y = 40000;int i = 1000000;cout << y << " " << i*i << "\n";Выполнив эту программу, получим следующий результат:
–25536 –727379968Этого следовало ожидать. Здесь мы видим эффект переполнения. Целочисленные типы позволяют представить лишь относительно небольшие целые числа. Нам просто не хватит битов, чтобы точно представить каждое целое число, поэтому нам необходим способ, позволяющий выполнять эффективные вычисления. В данном случае двухбайтовое число типа
shortintxxsizeof(x)sizeof(char)==1
charintdoubleЦелое число можно присвоить переменной, имеющей тип числа с плавающей точкой. Если целое число окажется больше, чем может представить тип числа с плавающей точкой, произойдет потеря точности. Рассмотрим пример.
cout << "размеры: " << sizeof(int) << ' ' << sizeof(float) << '\n';int x = 2100000009; // большое целое числоfloat f = x;cout << x << ' ' << f << endl;cout << setprecision(15) << x << ' ' << f << '\n';На нашем компьютере мы получили следующий результат:
Sizes: 4 42100000009 2.1e+0092100000009 2100000000Типы
floatintfloatintf9
float f = 2.8;int x = f;cout << x << ' ' << f << '\n';Значение переменной
x23floatint
Язык C++ не решит эту проблему за вас. Рассмотрим пример.
void f(int i, double fpd){ char c = i; // да: тип char действительно представляет // очень маленькие целые числа short s = i; // опасно: переменная типа int может // не поместиться // в памяти, выделенной для переменной // типа short i = i+1; // что, если число i станет максимальным? long lg = i*i; // опасно: переменная типа long не может // вместить результат