Стандартные математические функции в языке Си
Математические вычисления не ограничиваются лишь арифметическими действиями. Кроме них, можно ещё встретить корни, модули, логарифмы, тригонометрические функции и пр. Научимся же использовать подобные функции в своих программах.
Для использования математических функций нужно подключить заголовочный файл 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.)
- выполнение арифметических операций с разными типами аргументов
- перед выполнением присваивания
Правила неявного преобразования типов
- если выполняются арифметические операции с разными типами аргументов. Оба аргумента приводятся к большему типу.
Порядок типов: int < float < double - при присваивании. Значение справа от оператора присваивания приводится к типу переменной слева от оператора присваивания. При этом, если больший тип присваивается меньшему, то может произойти потеря точности.
Примеры:
int+float будет автоматически преобразовано к float+float
float/int будет автоматически преобразовано к float/float
double*float будет преобразовано к double*double
int = double double будет преобразовано к int с потерей дробной части
float = int int будет преобразовано к float
Оставить комментарий
Чтобы код красиво отображался на странице заключайте его в теги [code] здесь писать код [/code]
Комментарии
"Для использования математических функций нужно подключить заголовочный файл math.h"
в задачах на Степике функции pow(), fabs() (остальные не проверял) всё равно работают.
Это зависит от компилятора или стандартной библиотеки ?
Проверяю код, выводит нужный ответ, отправляю, пишет не правильно..
[/#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;
}]
Отсюда делаем вывод, что ваша формула вычисления расстояния d = |a| +|b| неправильная.
В комментарии выше человек использует формулу суммы модулей координат двух точек - это не правильно. Попробуйте поставить в такую формулу два отрицательных числа и сами увидите, что результат вычисления будет не верен.
#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;
}
Выдает ошибку, хотя все правильно(( Что делать??
Если ещё не разобрались, то напишите в комменты, что за ошибку вам выдало.
И ещё не понял про данный момент(с примерами):
-----при присваивании. Значение справа от оператора присваивания приводится к типу переменной слева от оператора присваивания. При этом, если больший тип присваивается меньшему, то может произойти потеря точности.
Заранее спасибо за ответ.
Объявлять эту переменную заранее не нужно, она уже объявлена.
Подсказка: В ответе нужно записать только одну строку -- вызов функции.
#include <stdio.h>
#include <math.h>
int main(void) {
double res = pow(2 ,5);
printf("%lf",res);
return 0;
}
Это нужно вставить в ответ? Или только строку:
double res = pow(2 ,5);
#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.