Стандартные математические функции в языке Си
Математические вычисления не ограничиваются лишь арифметическими действиями. Кроме них, можно ещё встретить корни, модули, логарифмы, тригонометрические функции и пр. Научимся же использовать подобные функции в своих программах.
Для использования математических функций нужно подключить заголовочный файл math.h
. В этой библиотеке определено много различных функций, но мы пока рассмотрим следующие:
Некоторые математические функции
fabs(x)
— модуль числа xsqrt(x)
— квадратный корень из числа xsin(x)
— синус числа x (х в радианах)cos(x)
— косинус числа x (х в радианах)pow(x, y)
— вычисление xyexp(x)
— вычисление exlog(x)
— натуральный логарифм числа xlog10(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.)
- выполнение арифметических операций с разными типами аргументов
- перед выполнением присваивания
Правила неявного преобразования типов
- если выполняются арифметические операции с разными типами аргументов. Оба аргумента приводятся к большему типу. Порядок типов:
int
<float
<double
- при присваивании. Значение справа от оператора присваивания приводится к типу переменной слева от оператора присваивания. При этом, если больший тип присваивается меньшему, то может произойти потеря точности.
Примеры:
int+float
будет автоматически преобразовано кfloat+float
float/int
будет автоматически преобразовано кfloat/float
double*float
будет преобразовано кdouble*double
int = double
double
будет преобразовано кint
с потерей дробной частиfloat = int
int
будет преобразовано кfloat
Практика
Дополнительные материалы
- пока нет