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

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

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

Пожалуйста, приостановите работу AdBlock на этом сайте.

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

Для использования математических функций нужно подключить заголовочный файл 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]

Samvel
Вот код.

#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("%.2fn", sin_a);

return 0;
}

Вот ошибка.
Invoking: Cross GCC Linker
gcc -o "c1" ./src/c1.o
./src/c1.o: In function `main':
/home/god/workspace/c1/Debug/../src/c1.c:8: undefined reference to `sin'
collect2: error: ld returned 1 exit status
makefile:30: recipe for target 'c1' failed
make: *** [c1] Error 1
Использую Eclipse Platform
Николай Евсюков
Несмотря на то, что написано
"Для использования математических функций нужно подключить заголовочный файл math.h"
в задачах на Степике функции pow(), fabs() (остальные не проверял) всё равно работают.

Это зависит от компилятора или стандартной библиотеки ?
KaDeaT
От настроек компилятора. Рекомендую всегда подключать необходимые заголовочные файлы.