cos в C/C++: разбираемся с примерами
👋 Привет! В этой статье мы разберем функцию cos
в C/C++. Эта функция вычисляет косинус угла. Начнем мы с рассмотрения примера использования этой функции, а потом попробуем реализовать ее сам остоятельно. В конце статьи вы найдете упражнения для закрепления материала.
Как вычислить косинус в C++
Для вычисления косинуса в C++ мы можем воспользоваться функцией cos
. Эта функция объявлена в заголовочном файле math.h
. В C++ вы можете подключать cmath
. Выглядит эта функция следующим образом:
double cos (double x);
- Первым аргументом функция принимает вещественное число. Тут мы передаем угол в радианах, для которого нужно посчитать косинус.
- Функция возвращает косинус переданного ей угла.
Давайте посмотрим на пример использования этой функции:
#include <cmath>
#include <iostream>
using namespace std;
int main() {
cout << "cos(M_PI * 1 / 3) = " << cos(M_PI * 1 / 3) << endl;
cout << "cos(M_PI * 2 / 3) = " << cos(M_PI * 2 / 3) << endl;
cout << "cos(M_PI) = " << cos(M_PI) << endl;
cout << "cos(0) = " << cos(0) << endl;
cout << "cos(2 * M_PI) = " << cos(2 * M_PI) << endl;
return 0;
}
Константа M_PI доступна после подключения библиотеки
<cmath>
. Это число примерно равно 3.1415.
Вывод программы:
cos(M_PI * 1 / 3) = 0.5
cos(M_PI * 2 / 3) = -0.5
cos(M_PI) = -1
cos(0) = 1
cos(2 * M_PI) = 1
Что будет выведено на экран?
#include <cmath>
#include <iostream>
using namespace std;
int main() {
cout << "cos(M_PI / 4) = " << cos(M_PI / 4) << endl;
return 0;
}
Как реализовать cos самому
Для вычисления косинуса без помощи сторонних библиотек, мы воспользуемся рядом Тейлора. Он позволяют разложить косинус на сумму вида:
Давайте реализуем функцию, которая будет подсчитывать этот ряд:
#include <cmath>
#include <iostream>
using namespace std;
// в этой функции мы будем считать факториал числа рекурсивно
int factorial(int n) {
if (n == 0) {
return 1;
}
return n * factorial(n - 1);
}
// подсчет степени числа
double pow(double base, int exponent) {
double result = 1;
for (int i = 0; i < exponent; i++) {
result *= base;
}
return result;
}
// нам нужно будет знать знак числа
double sign(double x) {
if (x > 0) {
return 1;
} else if (x < 0) {
return -1;
} else {
return 0;
}
}
// подсчет косинуса через ряд Тейлора выше
double my_cos(double x) {
// наша реализация работает только для чисел от -2*M_PI до 2*M_PI
// поэтому мы пользуемся тем, что cos(x) == cos(x + 2*M_PI) для любого x
while (fabs(x) >= 2 * M_PI) {
x -= sign(x) * 2 * M_PI;
}
double result = 1;
// тут мы подсчитываем 4 элементов ряда
// можно подсчитывать больше для лучшей точности
for (int i = 1; i <= 4; i++) {
double term = (double)pow(x, 2 * i) / factorial(2 * i);
if (i % 2 == 1) {
result -= term;
} else {
result += term;
}
}
return result;
}
int main() {
cout << "my_cos(M_PI * 1 / 3) = " << my_cos(M_PI * 1 / 3) << endl;
cout << "my_cos(M_PI * 2 / 3) = " << my_cos(M_PI * 2 / 3) << endl;
cout << "my_cos(M_PI) = " << my_cos(M_PI) << endl;
cout << "my_cos(0) = " << my_cos(0) << endl;
cout << "my_cos(2 * M_PI) = " << my_cos(2 * M_PI) << endl;
return 0;
}
Вывод этой программы:
my_cos(M_PI * 1 / 3) = 0.5
my_cos(M_PI * 2 / 3) = -0.499567
my_cos(M_PI) = -0.976022
my_cos(0) = 1
my_cos(2 * M_PI) = 1
Как вы можете видеть, наша функция подсчитывает косинус угла с погрешностью.
Функции cosl и cosf
Функции cosl
и cosf
работают как и обычный cos
, только с другими типами. Давайте посмотрим на прототип функции cosl
:
long double cosl (long double x);
Как можете видеть, функция cosl
принимает и возвращает long double
(cos
принимает и возвращает просто double
). Теперь давайте посмотрим на cosf
:
float cosf (float x);
Тут мы уже видим float
. Давайте попробуем сравнить результаты этих функций:
cout << "cosf(M_PI * 1 / 2) = " << cosf(M_PI * 1 / 2) << endl;
cout << "cos (M_PI * 1 / 2) = " << cos(M_PI * 1 / 2) << endl;
cout << "cosl(M_PI * 1 / 2) = " << cosl(M_PI * 1 / 2) << endl;
Вывод программы:
cosf(M_PI * 1 / 2) = -4.37114e-08
cos (M_PI * 1 / 2) = 6.12323e-17
cosl(M_PI * 1 / 2) = 6.12323e-17
Все результаты близки к нулю, но немного отличаются. Это из-за разной точности типов данных, которыми они оперируют.
Упражнения
-
Использование
cos
:
Напишите программу на C++, которая запрашивает у пользователя угол в радианах, вычисляет его косинус с помощью функцииcos
и выводит результат. Также программа должна выводить введенный пользователем угол. -
Собственная реализация
cos
:
Используя ряд Тейлора из статьи, создайте свою функцию для вычисления косинуса. Проверьте её работу на различных углах и сравните с результатами стандартной функцииcos
. -
Сравнение точности:
Напишите программу, которая сравнивает результаты вычисления косинуса с использованием стандартной функцииcos
и вашей собственной реализации. Выведите разницу между ними для различных углов.
Если хотите всегда быть в курсе последних новостей в мире программирования и IT, подписываетесь на мой Telegram-канал, где я делюсь свежими статьями, новостями и полезными советами. Буду рад видеть вас среди подписчиков!
Обсуждение