Числа и математические функции в C++
Числа в C++: целые и вещественные типы, диапазоны, математические функции из <cmath> и типичные ловушки целочисленного деления.
Числовые типы C++ — это фундамент вычислений. Правильный выбор типа экономит память и предотвращает переполнение.
Целочисленные типы
Размер типа определяет диапазон хранимых значений:
Тип | Размер | Диапазон |
| 2 байта | –32 768 … 32 767 |
| 4 байта | –2 147 483 648 … 2 147 483 647 |
| 8 байт | ±9.2 × 10¹⁸ |
| 4 байта | 0 … 4 294 967 295 |
#include <iostream>
int main() {
int a = 2'000'000; // разделители тысяч (C++14)
long long b = 9'000'000'000LL;
unsigned int c = 4'000'000'000u;
std::cout << a << "\n";
std::cout << b << "\n";
std::cout << c << "\n";
return 0;
}
Вывод:
2000000 9000000000 4000000000
Типы с плавающей точкой
float — 4 байта (~7 знаков), double — 8 байт (~15 знаков). Для большинства задач используйте double.
#include <iostream>
#include <iomanip>
int main() {
float f = 3.14159265358979f;
double d = 3.14159265358979;
std::cout << std::setprecision(15);
std::cout << "float: " << f << "\n"; // потеря точности
std::cout << "double: " << d << "\n";
return 0;
}
Вывод:
float: 3.14159274101257 double: 3.14159265358979
Ловушка: целочисленное деление
Если оба операнда целые — результат тоже целый, дробная часть отбрасывается:
#include <iostream>
int main() {
int a = 7, b = 2;
std::cout << a / b << "\n"; // 3, а не 3.5 !
std::cout << (double)a / b << "\n"; // 3.5 — приведение к double
return 0;
}
Вывод:
3 3.5
Достаточно привести один операнд к
double— второй поднимется автоматически.
Математические функции (<cmath>)
Функция | Действие |
| квадратный корень |
| x в степени y |
| модуль числа |
| округление вверх |
| округление вниз |
| округление к ближайшему |
#include <iostream>
#include <cmath>
int main() {
double x = 2.7;
std::cout << "sqrt(9) = " << sqrt(9.0) << "\n";
std::cout << "pow(2,10) = " << pow(2.0, 10.0) << "\n";
std::cout << "ceil(2.7) = " << ceil(x) << "\n";
std::cout << "floor(2.7) = " << floor(x) << "\n";
return 0;
}
Вывод:
sqrt(9) = 3 pow(2,10) = 1024 ceil(2.7) = 3 floor(2.7) = 2
Коротко
- Для целых используйте
int(по умолчанию) илиlong longдля больших чисел. - Для вещественных —
doubleточнееfloat. - Деление двух
intдаётint— дробная часть теряется. Приведите один кdouble. - Математические функции — в заголовке
<cmath>.
Проверьте себя
1. Что выведет: int a = 7, b = 2; cout << a / b;
A3
B3.5
C4
DОшибка компиляции
2. Какой тип точнее: float или double?
Adouble
Bfloat
CОдинаково
DЗависит от платформы
3. Из какого заголовка взять функцию sqrt()?
A<math.h> только
B<iostream>
C<numeric>
D<cmath>