ceil в C/C++: округление вверх

👋 Привет! В этой статье мы поговорим о функции ceil. Эта функция позволяет нам округлить число вверх в C/C++. Сначала мы посмотрим как использовать эту функцию на примере, а потом попробуем реализовать ее сами. Также мы разберемся чем отличается ceil от ceill и ceilf. В конце статьи вы найдете упражнения для закрепления материала.

Как округлить число вверх в C/C++

Для того, чтобы округлить число вверх в C/C++ мы можем воспользоваться встроенной функцией ceil. Эта функция доступна нам после подключения файла <math.h>. В C++ можно подключить <cmath>. Вот как выглядит прототип этой функции:

double ceil (double x);
  • Единственным аргументом функция принимает число, которое нужно округлить.
  • Возвращает функция результат округления.

Давайте посмотрим на пример:

#include <cmath>
#include <iostream>

using namespace std;

int main() {
  cout << "ceil(3) = " << ceil(3) << endl;
  cout << "ceil(12.34) = " << ceil(12.34) << endl;
  cout << "ceil(1.0000001) = " << ceil(1.0000001) << endl;
  cout << "ceil(0) = " << ceil(0) << endl;
  cout << "ceil(-0.25) = " << ceil(-0.25) << endl;
  cout << "ceil(-2) = " << ceil(-2) << endl;

  return 0;
}

Вывод программы:

ceil(3) = 3
ceil(12.34) = 13
ceil(1.0000001) = 2
ceil(0) = 0
ceil(-0.25) = -0
ceil(-2) = -2

Что будет выведено на экран?

#include <iostream>
#include <cmath>

using namespace std;

int main() {
  double a = -12.34;
  cout << ceil(a) << endl;

  return 0;
}
12
-12
13
-13

Как реализовать ceil самому

Давайте попробуем реализовать функцию ceil сами:

#include <iostream>

using namespace std;

double my_ceil(double x) {
  // Приведем число к целочисленному типу(это обрежет дробную часть)
  int int_part = (int)x;

  // Если число уже целое, возвращаем его
  if (x == int_part) {
    return int_part;
  }

  // Если число отрицательное, возвращаем его как целое число
  // Так как отрицательное число при округлении вверх идет к ближайшему
  // большему отрицательному числу (например, ceil(-2.3) = -2),
  // это эквивалентно простому преобразованию к целому числу
  else if (x < 0) {
    return int_part;
  }

  // Если число положительное и не целое, добавляем 1 к целой части числа
  else {
    return int_part + 1;
  }
}

int main() {
  cout << "my_ceil(3) = " << my_ceil(3) << endl;
  cout << "my_ceil(12.34) = " << my_ceil(12.34) << endl;
  cout << "my_ceil(1.0000001) = " << my_ceil(1.0000001) << endl;
  cout << "my_ceil(0) = " << my_ceil(0) << endl;
  cout << "my_ceil(-0.25) = " << my_ceil(-0.25) << endl;
  cout << "my_ceil(-2) = " << my_ceil(-2) << endl;

  return 0;
}

Вывод программы:

my_ceil(3) = 3
my_ceil(12.34) = 13
my_ceil(1.0000001) = 2
my_ceil(0) = 0
my_ceil(-0.25) = 0
my_ceil(-2) = -2

Функции ceill и ceilf

Функции ceill и ceilf, как и ceil, округляют переданное число вверх. Разница только в том, что они работают с вещественными числами long double (ceill) и float (ceilf). Давайте посмотрим на пример:

#include <cmath>
#include <iostream>

using namespace std;

int main() {
  cout << "ceill(12.34) = " << ceill(12.34) << endl;
  cout << "ceil (12.34) = " << ceil(12.34) << endl;
  cout << "ceilf(12.34) = " << ceilf(12.34) << endl;

  return 0;
}

Вывод:

ceill(12.34) = 13
ceil (12.34) = 13
ceilf(12.34) = 13

Как вы можете видеть, они возвращают одно и то же число, просто другого типа.

Упражнения

  1. Применение ceil:

    • Напишите программу на C++, которая запрашивает у пользователя вещественное число.
    • Примените к нему функцию ceil и выводите результат.
    • Ваша программа должна также выводить исходное число пользователя.
  2. Реализация своей версии ceil:

    • Используя предоставленный в статье пример, напишите свою версию функции ceil. Ваша функция должна быть названа my_ceil и принимать число типа double.
    • Проверьте её работу, используя различные числа, и сравните результаты с встроенной функцией ceil.
  3. Сравнение ceil, ceill и ceilf:

    • Напишите программу, которая демонстрирует различия между ceil, ceill, и ceilf.
    • Ваша программа должна включать в себя вызовы всех трёх функций и вывод результатов их работы на экран.

Обсуждение