Действительные числа

Целочисленные типы

Ранее рассматривался только один тип целочисленных переменных — int. На самом деле существует несколько основных целочисленных типов, тип int — лишь один (но наиболее часто используемый) из них.

Таблица основных целочисленных типов

Название Размер Знаковый Синонимы
short2 байтаЗнаковыйshort int, signed short, signed short int
unsigned short2 байтаБеззнаковыйunsigned short int
int4 байтаЗнаковыйsigned int
unsigned4 байтаБеззнаковыйunsigned int
long4 байтаЗнаковыйlong int, signed long, signed long int
unsigned long4 байтаБеззнаковыйunsigned long int
long long8 байтЗнаковыйlong long int, signed long long, signed long long int
unsigned long long8 байтБеззнаковыйunsigned long long int

То есть типы бывают “короткими” (short), обычными, длинными (long) и очень длинными (long long). Последний тип является расширением компилятора GNU C++ и не являлся стандартным типом для языка C++, поэтому в старых реализациях он мог называться по-другому (например, в Microsoft Visual C++ аналогичный тип называется int64). Чем “длиннее” тип, тем большее количество различных значений он может принимать и тем больше памяти он занимает.

Также типы бывают знаковыми (signed), которые могут принимать как положительные, так и отрицательные значения, и беззнаковыми (unsigned), которые принимают только неотрицательные значения.

Таблица диапазонов значений

НазваниеРазмерМинимальное значениеМаксимальное значение
short16 бит-2¹⁵ = -327682¹⁵−1 = 32767
unsigned short16 бит02¹⁶−1 = 65535
int, long32 бита-2³¹ = -21474836482³¹−1 = 2147483647
unsigned, unsigned long32 бита02³²−1 = 4294967295
long long64 бита-2⁶³ = -92233720368547758082⁶³−1 = 9223372036854775807
unsigned long long64 бита02⁶⁴−1 = 18446744073709551615

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

Тип16-битный процессор32-битный процессор64-битный процессор
short2 байта2 байта2 байта
int2 байта4 байта4 байта
long4 байта4 байта8 байт
long long8 байт8 байт

Действительные типы

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

Например, расстояние от Земли до Солнца равно 1.496·10¹¹, а масса молекулы воды — 2.99·10⁻²³.

В программах на C++ такие числа записываются через букву e: 1.496e11 и 2.99e-23. Перед числом может стоять знак минус. Пробелы внутри не ставятся.

Типы для представления действительных чисел

Тип Точность Размер Количество знаков мантиссы Минимальное положительное значение Максимальное значение
floatОдинарная4 байта71.4e-453.4e38
doubleДвойная8 байт155.0e-3241.7e308
long doubleРасширенная10 байт191.9e-49511.1e4932

Операция деления

Для действительных чисел определены операции сложения, вычитания, умножения и деления.

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

cout << 10  / 3  << endl;
cout << 10. / 3  << endl;
cout << 10  / 3. << endl;
cout << 10. / 3. << endl;

Этот код выведет 3 в первой строке и 3.33333 в остальных.

Результат деления не зависит от типа переменной, которой он присваивается. Например:

double a = 10 / 3;

переменная a будет равна 3, потому что 10 / 3 — это целочисленное деление.

Приведение типов

Иногда требуется явно привести выражение одного типа к другому. Например, если есть две переменные a и b типа int и нужно вычислить их частное как вещественное:

double d;
d = a / b;

Такой код будет неверным, потому что a / b — это целочисленное деление. Правильный вариант:

double d;
d = (double)a / b;

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

Упражнение

Определите, чему будут равны следующие переменные:

int a = 13 / 5;
int b = 13 % 5;
int c = 13.0 / 5;
double d = 13 / 5;
double e = 13 % 5;
double f = 13.0 / 5;
double g = 13 / 5 + 2 / 5;
double h = 13.0 / 5 + 2.0 / 5;
int i = 13.0 / 5 + 2.0 / 5;

Список математических функций

В стандартную библиотеку C++ входит множество математических функций. Чтобы использовать их, нужно подключить заголовочный файл:

#include <cmath>

Функция от одного аргумента вызывается, например, так:

y = sin(x);
cout << sqrt(2) << endl;

Функции округления

Корни, степени, логарифмы

Тригонометрические функции

Также в <cmath> есть полезные числовые константы, например M_PI — число π. В Visual C++ для их использования нужно добавить:

#define _USE_MATH_DEFINES
#include <cmath>

Точность вывода

По умолчанию действительные числа выводятся с 6 знаками после запятой. Но переменные типа double хранят числа с точностью до 15–16 знаков. Чтобы изменить точность вывода, используйте:

cout.precision(15);

← Вернуться на главную