Числа и математические функции в C++

Числа в C++: целые и вещественные типы, диапазоны, математические функции из <cmath> и типичные ловушки целочисленного деления.

Числовые типы C++ — это фундамент вычислений. Правильный выбор типа экономит память и предотвращает переполнение.

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

Размер типа определяет диапазон хранимых значений:

Тип

Размер

Диапазон

short

2 байта

–32 768 … 32 767

int

4 байта

–2 147 483 648 … 2 147 483 647

long long

8 байт

±9.2 × 10¹⁸

unsigned int

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>)

Функция

Действие

sqrt(x)

квадратный корень

pow(x, y)

x в степени y

abs(x)

модуль числа

ceil(x)

округление вверх

floor(x)

округление вниз

round(x)

округление к ближайшему

#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>