Главная > Уроки > Стандартные математические функции в языке Си

Записывайся на этот курс на Stepike!

Стандартные математические функции в языке Си

Математические вычисления не ограничиваются лишь арифметическими действиями. Кроме них, можно ещё встретить корни, модули, логарифмы, тригонометрические функции и пр. Научимся же использовать подобные функции в своих программах.

Для использования математических функций нужно подключить заголовочный файл math.h. В ней определено много различных функций, но мы пока рассмотрим следующие:

Некоторые математические функции

fabs(x) модуль числа x
sqrt(x) квадратный корень из числа x
sin(x) синус числа x (х в радианах)
cos(x) косинус числа x (х в радианах)
pow(x, y) вычисление xy
exp(x) вычисление ex
log(x) натуральный логарифм числа x
log10(x) десятичный логарифм числа x

Два важных момента.

  • Все функции возвращают значение типа double.
  • Параметры функций – вещественные числа(double), но можно передавать и целые числа. При этом произойдёт неявное преобразование типа. Компилятор из целого числа, например 3, сделает вещественное 3.0.

Примеры.
Даны длины катетов прямоугольного треугольника. Вычислить длину гипотенузы. Простая задачка на знание теоремы Пифагора.

Листинг 1.

#include <stdio.h>
#include <math.h> // подключаем math.h
int main (void) {
  int a, b, c2;

  scanf("%d",&a);
  scanf("%d",&b);
	
  c2 =  a*a + b*b;
  printf("c = %.2f\n", sqrt(c2)); 

  return 0;
}

Вычислить синус угла ввёденного с клавиатуры. Угол вводится в градусах.

Листинг 2.

#include <stdio.h>
#include <math.h> // подключаем math.h
int main (void) {
  double alpha, sin_a, pi = 3.1415926;
 
  scanf("%lf",&alpha);
  alpha =  alpha*pi/180; 
  sin_a = sin(alpha);
  printf("%.2f\n", sin_a); 

  return 0;
}

В этой программе есть о чём поговорить. Тригонометрические функции, которые определены в math.h работают с радианной мерой угла. Людям же привычнее работать с градусами. Поэтому в данной программе мы предварительно перевели значение из градусов в радианы. Если этого не сделать, результат получится неправильным. Проверьте это самостоятельно.

Неявное преобразование типов

При явном преобразовании типа мы в скобках перед значением указывали тип, к которому нужно привести данное значение. В неявном преобразовании этого делать не нужно. Компилятор автоматически подберёт необходимый тип.

Неявное преобразование типов осуществляется в следующих случаях:

  1. перед передачей аргументов в функцию (как в нашем примере с корнем. Листинг 1.)
  2. выполнение арифметических операций с разными типами аргументов
  3. перед выполнением присваивания

Правила неявного преобразования типов

  • если выполняются арифметические операции с разными типами аргументов. Оба аргумента приводятся к большему типу.
    Порядок типов: int < float < double
  • при присваивании. Значение справа от оператора присваивания приводится к типу переменной слева от оператора присваивания. При этом, если больший тип присваивается меньшему, то может произойти потеря точности.

Примеры:

int+float будет автоматически преобразовано к float+float
float/int будет автоматически преобразовано к float/float
double*float будет преобразовано к double*double
int = double double будет преобразовано к int с потерей дробной части
float = int int будет преобразовано к float

Сохрани в закладки или поддержи проект.

Практика

Решите предложенные задачи:

Для удобства работы сразу переходите в полноэкранный режим

Дополнительные материалы

  1. пока нет

Оставить комментарий

Чтобы код красиво отображался на странице заключайте его в теги [code] здесь писать код [/code]

Комментарии

Николай Евсюков
Несмотря на то, что написано
"Для использования математических функций нужно подключить заголовочный файл math.h"
в задачах на Степике функции pow(), fabs() (остальные не проверял) всё равно работают.

Это зависит от компилятора или стандартной библиотеки ?
KaDeaT
От настроек компилятора. Рекомендую всегда подключать необходимые заголовочные файлы.
Владимир
прошу прощения, туплю...pow(x, y) понимаю, exp(x) не ясно что и во что возводится...гуглил, говорится про е...но как мне понять к чему это?
KaDeaT
exp(x) возводит число e (число Эйлера, или число Непера) в степень х.
Шамиль
Я чего то не понимаю, задание с выводом расстояния между точками.
Проверяю код, выводит нужный ответ, отправляю, пишет не правильно..
[/#include <stdio.h>
#include <math.h>
int main() {
int x1, x2, res;
scanf("%d", &x1);
scanf("%d", &x2);
x1 = fabs(x1);
x2 = fabs(x2);
res = x1 + x2;
printf("%d", res);
return 0;
}]
KaDeaT
Если в вашу программу ввести точки 1 и 2, то получим расстояние между ними 3. А между точками 2 и 3 расстояние 5.
Отсюда делаем вывод, что ваша формула вычисления расстояния d = |a| +|b| неправильная.
Yupi
Если есть проблемы с формулой для вычисления длины отрезка на координатной прямой, то вот ссылка, где подробно написано, как вычислять: http://www.cleverstudents.ru/vectors/distance_from_point_to_point.html

В комментарии выше человек использует формулу суммы модулей координат двух точек - это не правильно. Попробуйте поставить в такую формулу два отрицательных числа и сами увидите, что результат вычисления будет не верен.
KaDeaT
Да, всё верно. У автора выше неправильная формула для вычисления расстояний между двумя точками на прямой. Спасибо!
Evgeny
#include <stdio.h>
#include <math.h>
int main(void) {
int X1=-39, X2=62;
int X3;
X3=fabs(X2-X1);
printf("%d", X3);
// put your code here
return 0;
}

Выдает ошибку, хотя все правильно(( Что делать??
KaDeaT
Вообще, самое правильное решение в таких случаях это загуглить ошибку.

Если ещё не разобрались, то напишите в комменты, что за ошибку вам выдало.


Владимир
Добрый день. Немного не понял про неявное преобразование типов. Неявное преобразование происходит когда какая либо функция возвращает тип float или double?
И ещё не понял про данный момент(с примерами):
-----при присваивании. Значение справа от оператора присваивания приводится к типу переменной слева от оператора присваивания. При этом, если больший тип присваивается меньшему, то может произойти потеря точности.
Заранее спасибо за ответ.
Rada
Где зал славы 4 урока?
KaDeaT
Я его не сделал. =(
Сергей
Напишите вызов функции pow для возведения числа 2 в степень 5. Результат присвойте переменной с именем res.
Объявлять эту переменную заранее не нужно, она уже объявлена.

Подсказка: В ответе нужно записать только одну строку -- вызов функции.


#include <stdio.h>
#include <math.h>

int main(void) {

double res = pow(2 ,5);

printf("%lf",res);
return 0;
}
Это нужно вставить в ответ? Или только строку:
double res = pow(2 ,5);
KaDeaT
Только строку. Но обратите внимание на последнее предложение в условии. Переменная res уже объявлена, а в вашей строке вы повторно её объявляете.
Никита
#include <stdio.h>
#include <iostream>
#include <math.h>

using namespace std;

int main() {

int x1, x2, res;

cin >> x1 >> x2

res=fab(x1)-fab(x2);

printf("%d", res);


return 0;
}

Ошибка Compilation error
main.c:2:20: fatal error: iostream: No such file or directory
#include <iostream>
^
compilation terminated.