Include cmath c что это

от admin

Математические функции в С++

В С++ определены в заголовочном файле <cmath> функции выполняющие некоторые часто используемые математические задачи. Например, нахождение корня, возведение в степень, sin() , cos() и многие другие. В таблице 1 показаны основные математические функций, прототипы которых содержатся в заголовочном файле <cmath> .

Таблица 1 — Математические функции в С++

Функция Описание Пример
abs( a ) модуль или абсолютное значение от а abs(-3.0)= 3.0
abs(5.0)= 5.0
sqrt(a) корень квадратный из а, причём а не отрицательно sqrt(9.0)=3.0
pow(a, b) возведение а в степень b pow(2,3)=8
ceil( a ) округление а до наименьшего целого, но не меньше чем а ceil(2.3)=3.0
ceil(-2.3)=-2.0
floor(a) округление а до наибольшего целого, но не больше чем а floor(12.4)=12
floor(-2.9)=-3
fmod(a, b) вычисление остатка от a/b fmod(4.4, 7.5) = 4.4
fmod( 7.5, 4.4) = 3.1
exp(a) вычисление экспоненты е а exp(0)=1
sin(a) a задаётся в радианах
cos(a) a задаётся в радианах
log(a) натуральный логарифм a(основанием является экспонента) log(1.0)=0.0
log10(a) десятичный логарифм а Log10(10)=1
asin(a) арксинус a, где -1.0 < а < 1.0 asin(1)=1.5708

Необходимо запомнить то, что операнды данных функций всегда должны быть вещественными, то есть a и b числа с плавающей точкой. Это связано с тем, что существует несколько экземпляров перегруженных функций, соответствующих списку аргументов. Тему перегруженные функции рассмотрим немного позже, а пока надо запомнить, что a и b числа с плавающей точкой. Разработаем программу, которая будет использовать математические функции.

Итак, чтобы воспользоваться данными функциями необходимо подключить заголовочный файл <cmath> как в строке 5, после чего можно использовать любую из функций, прототипы которых находятся в этом заголовочном файле. Результат работы программы (см. Рисунок 1).

Рисунок 1 — Математические функции в С++

Чтобы увидеть полный перечень функций в данном заголовочном файле, просто откройте его. Сделать это можно либо через поиск, либо через обозреватель решений, если программируете в MVS (см. Рисунок 2). В «Обозревателе решений» открываем вложенный каталог «Внешние зависимости«, в нём находим файл cmath . Открыв его, можно увидеть полный список математических функций.

Рисунок 2 — Математические функции в С++

Открыть заголовочный файл можно, нажав правой кнопкой мыши по его имени, как показано на рисунке 3. В появившемся окне выбираем пункт Открыть документ <cmath> .

Урок 5. Стандартная библиотека С++ (Часть 1)

Также, начиная с этого урока начинаем рассуждать о хорошем стиле программирования (см. примеры). Рекомендую не просто смотреть на исходный код, а пытаться его запускать. Также, очень полезно выполнить мини-задания, указанные в уроке. Свои варианты решения заданий можно выкладывать в комментариях.

1 Математическая библиотека Си/С++

Наиболее часто используемые математические функции стандартной библиотеки приведены в таблице:

Функция Описание работы функции
double sqrt(x) возвращает корень из положительного числа x
double pow(x, y) $$возвращает \quad x^y$$
double fabs (double x) и std::abs(x) вычисляет абсолютное значение числа х
double fmod (double x, double y) вычисляет остаток от деления х на y , то есть делает тоже самое, что оператор % , но для дробных чисел
double ceil (double x) Возвращает наименьшее целое (представленное как double ), которое не меньше чем х . Читай — округляет число до ближайшего целого «вверх»
double floor(double x) По аналогии с ceil , округляет число «вниз»
double sin(double x) , а также функции cos , tan , acos , atan , asin Соответствуют тригонометрическим функциям — синус, косинус, тангенс, а также обратным функциями — арксинус, арктангенс, арккосинус. Особенность их использования заключается в том, что углы задаются в радианах, а не градусах. Если у вас в программе используются углы — перед работой с функциями — переведите их в радианы по формуле:
$$
\frac<\alpha_> <\pi>= \frac<\alpha_><180>
$$
double exp(double x) $$Вычисляет \quad e^x$$
double log(double x) и double log10(double x) Возвращают натуральный и десятичный логарифмы числа x

1.1 Пример — расчет расстояния между точками

Рассмотрим программу, рассчитывающую расстояние между точками на плоскости:

Для возвещение в квадрат в этом примере можно было бы использовать функцию pow , однако это:

  • крайне неэффективно, так как pow имеет очень сложную реализацию, ведь она возводит число не в целую, а в любую дробную степень. Она выполнит массу вычислений, хотя нам нужно лишь одно умножение;
  • усложнит код. Что более наглядно x*x + y*y или pow(x,2) + pow(y,2) ?

Вообще, при написании кода стоит больше внимания уделять его простоте и понятности, а не вопросам оптимизации. На эту тему написано достаточно много в книге Мартина [1], как и многих других книгах по рефакторингу кода. Также, «преждевременной оптимизацией» не рекомендуют заниматься Маерс [2] и Саттер [3] — очень авторитетные люди в мире С++. Этот совет касается любых языков программирования, а не только С++. В качестве примера, иллюстрирующего проблему рекомендую посмотреть разбор школьной олимпиадной задачи «Уравнение» [4], обратить внимание на пояснения в конце разбора.

На самом деле, оптимизировать надо когда у вас уже возникли проблемы с производительностью и при этом, выполнять оптимизацию не абы где, а лишь там где реально возникли проблемы — такие места устанавливают с помощью специальных инструментов (профайлеров). Я бы не уделял столько внимания вопросу преждевременной оптимизации, но начинающие программисты (особенно на С++) очень часто допускают эту ошибку.

1.2 Пример — применение тригонометрических функций к углу в градусах

Пример программы, запрашивающей у пользователя угол в градусах, переводящей его в радианы и считающей его синус, косинус и тангенс:

В предыдущем примере уже использовалась функция precision для задания точности выводимых значений, однако, она ограничивает точность «сверху», то есть в данном случае — не более пяти знаков. Нередко хочется выводить данные в колонки одинаковой ширины и всегда выводить одинаковое число знаков у чисел — для этого надо передать в поток вывода (например cout ) функцию fixed , как показано в примере.

Также, в этой программе стоит обратить внимание на вторую строку. Дело в том, что для перевода угла в радианы нам потребуется константа «пи». Мы могли бы использовать вместо нее значение 3.14 , однако, это очень плохая практика, называемая «Магические числа» (Magic numbers) [5]. Наиболее типичным решением проблемы является использование именованных констант, то есть мы могли бы написать:

const double pi = 3.14

Однако, и это является плохим решением. Ведь может потребоваться число «пи» с более высокой точностью, а главное — такая константа (как и многие другие) уже определена в стандартной библиотеке. Чтобы начать их использовать надо добавить макрос #define _USE_MATH_DEFINES перед подключением библиотеки cmath . Именно за счет этой строки мы можем в коде обращаться к константе M_PI .

2 Функции стандартного вывода и вывода в Си и С++

При программировании на языке С++ вам доступны все функции стандартной библиотеки Си. Обойтись можно без них, однако Си гораздо проще чем С++, поэтому удобно начать изучение с функций Си, а потом уже перейти к их более продвинутым аналогам. Например, в предыдущих урока мы уже использовали конструкции типа cout << , однако понять их сможем еще не скоро — нам потребуется изучить тему объектно-ориентированного программирования и научиться перегружать операторы.

В Си для вывода данных на экран используется функция printf , а для ввода с клавиатуры — scanf . Рассмотрим работу с ними на примере программы, запрашивающей 2 целых числа и выводящих на экран их сумму:

В итоге формируется строка типа "The program calculated: 3 + 4 = 7" . Видно, что с помощью printf можно вывести на экран строку точно также как с помощью cout . Обратите внимание:

  1. на тех местах в выводимой строке, где должны быть подставлены значения переменных записано "%d" , а после строки вывода в функцию printf передаются переменные, значения которых надо подставить;
  2. "%d" можно использовать только для целых чисел. Если в приведенной выше программе в качестве значения a ввести 3.5 то она не запросит второе число, а присвоит ему значение 0 и сразу выведет результат (попробуйте);
  3. Строка типа «%d» называется «модификатор формата», их существует больше десятка- для ввода чисел разных типов и в разных системах счисления, указателей, строк и т.п. Наиболее часто используются "%f" для дробных чисел, и "%s" — для строк. Есть много нюансов их использования, которые всегда можно посмотреть в документации, например при выводе дробных чисел можно задать точность;
  4. последовательность "\n" соответствует переводу строки, вы можете использовать это вместо endl при выводе с помощью cout ;
  5. функция getchar() ожидает ввода символа с клавиатуры, решает ту же задачу, что cin.get из первого урока.

Приведенная программа некорректно работала при вводе дробных чисел вместо целых, это связано с тем, что после считывания первого числа в буфере клавиатуры остается последовательность ".5" . Программа пытается считать второе целое число, обнаруживает точку в буфере клавиатуры и завершает ввод. Решить проблему можно изменив типы переменных и модификаторы формата (обратите внимание на "%.2f" :

Теперь программа прекрасно работает с дробными числами, но сработает некорректно при вводе произвольных строк вместо чисел (попробуйте). Часто при некорректном вводе нужно запросить у пользователя данные повторно. Для этого сначала нужно обнаружить проблему — функция scanf возвращает количество переменных, которым были успешно присвоены значения. Если ввод некорректный, то перед новым вводом надо из буфера клавиатуры удалить «мусор» — это можно сделать функцией gets из модуля stdlib.h :

Эта программа просит пользователя ввести значения пока оба числа не окажутся введены корректно. Конструкцию, которая используется в строке 9 мы пока что не изучали, но тут создается буфер из 255 символов, в который считываются данные из буфера клавиатуры. Дело в том, что чтобы удалить данные из буфера клавиатуры — их надо считать. В строке 10 эти данные считываются, при этом в старых компиляторах не требуется указывать размер буфера, а в новых — это необходимо, тут показаны оба варианта.

Выше описаны функции ввода/вывода на языке Си, но можно решить эту задачу и с помощью более знакомых нам конструкций языка С++:

Этот пример почти эквивалентен рассмотренному ранее. Все новые используемые в нем функции описаны в статье «Проверка вводимых потоковых данных С++» [6], обратитесь к ней в случае возникновения вопросов.

3 Замечания по работе с дробными числами

Основное замечание формулируется так — дробные числа в компьютере хранятся с некоторой погрешностью. Это не связано со стандартной библиотекой С++ и вообще языком программирования, на Java/C# и любом другом языке вы тоже должны учитывать эту особенность.

Как учитывать? — Дробные числа никогда нельзя сравнивать оператором == , так как 0.5 на самом деле может быть равно чему-то типа 0.49999999999876 или 0.500000000000343 и при сравнении этих чисел вы можете получить неожиданный результат.

Чтобы понять масштаб катастрофы — попробуйте запустить такую программу:

Она перебирает углы от нуля до 180 , для каждого из них считает тангенс по известной всем формуле и сверяет полученное значение с результатом работы стандартной функции tan . Оказывается, что для ряда углов результаты совпадают, а для других — нет, причем, при запуске этой программы на другом компьютере или при использовании другого компилятора вы можете получить другие результаты.

Вывод — дробные числа всегда надо сравнивать с учетом некоторой погрешности. Иными словами, числа a и b равны при условии:

C++ Cmath Library

To make Mathematical problems stress-free for the programmer, C++ offers a library that contains all the functionalities we use in our routine to solve mathematical problems. The ‘cmath’ library contains logarithmic, exponential, hyperbolic, power, trigonometric, and many more. To access all the mathematical built-in methods, we must include one statement in the code:

Example no. 1:

In this case, let us observe how we can use the ‘cmath’ library to implement all the trigonometric functions.

using namespace std ;

double value_0 = 90 ;

We first import two libraries, the ‘iostream’ library for calling the input and output methods and the ‘cmath’ library for calling the mathematical functions in our program. In the main()function, declare and define a double-type variable or integer-type variable because the initialized value is an integer. But if we want to store the output after performing the operations ‘double’ data type would be recommended because the answer of such functions is mostly a float value. Then, in this code, we implemented the inbuilt trigonometric functions. Cout a message and then find the cos of the value assigned to the variable ‘value_0’ by using the cos() trigonometric method. Copy this statement and paste it five times in the code. We have to change the message a little bit and the function name from cos() to sin() and tan(), arcsin(), arccos(), arctan(). We called all the trigonometric methods one by one. All these functions require only one parameter. Then, the compiler will execute the code line by line and will print the message and the value on the console. The compiler will run the code and it goes into the ‘cmath’ library and finds the trigonometric method that is called in the program and fetches the code for that method. Then, it puts our defined value in that method to get the required answer. \n is used to make code look presentable on the console.

Example no. 2:

Employ the ‘cmath’ library power methods that can be accessed by just importing the library.

using namespace std ;

int value_1 = 560 ;

cout << " \n cbrt of 560 is :" << cbrt ( value_1 ) ;

The program is started by importing the two libraries ‘iostream’ and ‘cmath’. The ‘cmath’ header file is utilized to access Mathematical functions. Then, in the main() function, define a variable ‘value_1’ of type ‘int’ and initialize it with an integer number. After that, we need to print a message on the terminal so we call the ‘cout’ statement. Here we will employ the power functions. First, use ‘cout’ to display a message, then we will find the square of an integer value. For that purpose, sqrt() will be called and it is a method of the ‘cmath’ library. It takes only one parameter and it accepts the value whose square root we are trying to determine. Once again, employing the ‘cout’ statement to show the text and find the cube root of the same value by using cbrt() function. It also takes one parameter. Now, we will utilize the pow() method to find the power. This method contains two parameters: the first one will be the base value and the second is power. The compiler implements the program and prints a message on the console and evaluates the power methods.

Example no. 3:

We will discuss the exponential and logarithmic inbuilt methods of the ‘cmath’ library with the implementation.

using namespace std ;

int Number_0 = 60 ;

cout << " \n log2 of 60 is :" << log2 ( Number_0 ) ;

cout << " \n exp2 of 60 is :" << exp2 ( Number_0 ) ;

Now, we will discuss the logarithm and exponential methods of the ‘cmath’ library. For this, we have to integrate the libraries ‘iostream’ and ‘cmath’. After this, call the main() method to declare and initialize the integer type variable ‘Number_0’. Then, ‘cout’ a message and call the log(), log2(), and log10() to find the log of required value to the base 2 and 10. The log() function and log10() function work in the same way but there is a very minor difference between their outputs. Then to find the exponent of the value ‘60’ use exp() and exp2() functions. This code is executed by entering the ‘return 0’ command at the end.

Example no. 4:

In this example code, we will utilize the hyperbolic functions that are applied in differential equations.

using namespace std ;

double Val_0 = 30 ;

cout << " \n arcCosh of 30 is :" << acosh ( Val_0 ) ;

cout << " \n arcSinh of 30 is :" << asinh ( Val_0 ) ;

cout << " \n arcTanh of 30 is :" << atanh ( Val_0 ) ;

After importing the libraries ‘iostream’ and ‘cmath’, we would invoke the main() method. In the next statement, a variable having a ‘double’ data type is initialized. Now, call the cosh(), sinh(), tanh(), acosh(), asinh(), and atanh() to find the hyperbolic functions of the specified value. Utilize the ‘cout’ command six times to represent the text on the terminal and then employ all the above-mentioned hyperbolic methods one by one. The hyperbolic solutions of the value ‘Val_0’ will be obtained after running the program. The compiler solves these methods because their code is already defined in C++ ‘cmath’ library. So, the compiler fetches the code and executes all these hyperbolic functions.

Conclusion

In this guide, we have explored the ‘cmath’ library that C++ provides to solve basic Mathematical problems and help programmers to stick to the actual problem they want to solve. We started with the very basics of the C++ ‘cmath’ library and then implemented its functions using various coding examples. The methods discussed in the above codes include logarithmic, exponential, power, trigonometric and hyperbolic functions of the ‘cmath’ library. Not all of the methods of the ‘cmath’ library are defined here, but most of them are. This library contains numerous functions which are used to deal with arithmetic problems.

About the author

Ann-ul Hayyat

I’m a professional SEO and technical content writer with extensive experience in these fields as well as writing content for blogs, websites, reports, and other topics related to education, science, sports, and many other areas. I am skilled and experienced in creating SEO-friendly blog posts, technical articles, and other content on themes that you may find interesting.

C++ Math

C++ has many functions that allows you to perform mathematical tasks on numbers.

Max and min

The max(x,y) function can be used to find the highest value of x and y:

Example

And the min(x,y) function can be used to find the lowest value of x and y:

Example

C++ <cmath> Header

Other functions, such as sqrt (square root), round (rounds a number) and log (natural logarithm), can be found in the <cmath> header file:

Example

// Include the cmath library
#include <cmath>

Other Math Functions

A list of other popular Math functions (from the <cmath> library) can be found in the table below:

Читать:
Zanussi zob482x как почистить стекло

Похожие статьи