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

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

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

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

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

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

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

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

Листинг 1.

#include #include // подключаем 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 #include // подключаем 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

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


В языках С и C++ определено множество разнообразных математических функций. Сначала оба языка поддерживали один и тот же набор, состоящий из 22 математических функций. Однако по мере развития языка C++ расширялся и арсенал определенных в нем функций. Затем в версии С99 размер математической библиотеки значительно увеличился. В результате этих изменений библиотеки математических функций языков С и C++ стали существенно отличаться одна от другой. Поэтому в данной главе описываются математические функции языка С(включая те, которые добавлены в версии С99), а в главе 9 уделено внимание исключительно функциям языка C++. При этом имейте в виду, что исходный набор математических функций по-прежнему поддерживается всеми версиями языков С и C++.

Для использования всех математических функций в программу необходимо включить заголовок . Помимо объявления математических функций, этот заголовок определяет один или несколько макросов. В версии С89 заголовком определяется только макрос HUGE_VAL, который представляет собой значение типа double, сигнализирующее о возникшем переполнении.

В версии С99 определены следующие макросы.

В версии С99 определены следующие макросы(подобные функциям), которые классифицируют значение.

В версии С99 определены следующие макросы сравнения, аргументами которых(a и b) должны быть значения с плавающей точкой.

Эти макросы прекрасно обрабатывают значения, которые не являются числами, не вызывая при этом исключений вещественного типа.

Макросы EDOM и ERANGE также используются математическими функциями. Эти макросы определены в заголовке .

Ошибки в версиях С89 и С99 обрабатываются по-разному. Так, в версии С89, если аргумент математической функции не попадает в домен, для которого он определен, возвращается некоторое значение, зависящее от конкретной реализации, а встроенная глобальная целая переменная errno устанавливается равной значению EDOM. В версии С99 ошибка нарушения границ домена также приводит к возврату значения, зависящего от конкретной реализации. Однако по значению math_errhandling можно судить о выполнении других действий. Если math_errhandling содержит значение MATH_ERRNO, встроенная глобальная целая переменная errno устанавливается равной значению EDOM. Если же math_errhandling содержит значение MATH_ERREXCEPT, возбуждается исключение вещественного типа.

В версии С89, если функция генерирует результат, который слишком велик для возможностей представления, происходит переполнение. В этом случае функция возвращает значение HUGE_VAL, а переменная errno устанавливается равной значению ERANGE, сигнализирующему об ошибке диапазона. При обнаружении потери значимости функция возвращает нуль и устанавливает переменную errno равной значению ERANGE. В версии С99 ошибка переполнения также приводит к тому, что функция возвращает значение. HUGE_VAL, а при потере значимости - нуль. Если math_errhandling содержит значение MATH_ERRNO, глобальная переменная errno устанавливается равной значению ERANGE, свидетельствующему об ошибке диапазона. Если же math_errhandling содержит значение MATH_ERREXCEPT, возбуждается исключение вещественного типа.

В версии С89 аргументами математических функций должны быть значения типа double и значения, возвращаемые функциями, имеют тип double. В версии С99 добавлены float- и long double-варианты этих функций, которые используют суффиксы f и l соответственно. Например, в версии С89 функция sin() определена следующим образом.

Double sin(double arg);

В версии С99 поддерживается приведенное выше определение функции sin() и добавляются еще две ее модификации - sinf() и sinl().

Float sinf(float arg); long double sinl(long double arg);

Операции, выполняемые всеми тремя функциями, одинаковы; различаются лишь данные, подвергаемые этим операциям. Добавление f- и 1-модификаций математических функций позволяет использовать версию, которая наиболее точно соответствует вашим данным.

Поскольку в версии С99 добавлено так много новых функций, стоит отдельно перечислить функции, поддерживаемые версией С89(они также используются в языке C++).

acos asin atan atan2 ceil
cos cosh exp fabs floor
fmod frexp ldexp log log10
modf pow sin sinh sqrt
tan tanh

И еще одно: все углы задаются в радианах.


Смотрите также


acos - Возвращает значение арккосинуса
acosh - Возвращает значение гиперболического арккосинуса
asin - Возвращает значение арксинуса
asinh - Возвращает значение гиперболического арксинуса
atan - Возвращает значение арктангенса
atan2 - Возвращает значение арктангенса от а/Ь
atanh - Возвращает значение гиперболического арктангенса
cbrt - Возвращает значение кубического корня
ceil - Возвращает наименьшее целое, которое больше значения заданого аргумента
copysign - Наделяет заданный аргумент знаком, который имеет указаный аргумент
cos - Возвращает значение косинуса
cosh - Возвращает значение гиперболического косинуса
erf - Возвращает значение функции ошибок
erfc - Возвращает дополнительное значение функции ошибок
exp - Возвращает значение экспоненты
exp2 - Возвращает число 2, возведенное в заданную степень
expm1 - Возвращает уменьшенное на единицу значение натурального логарифма е
fabs - Возвращает абсолютное значение
fdim - Возвращает нуль или разность в двух заданных аргументов
floor - Возвращает наибольшее целое которое меньше или равно значению заданного аргумента
fma - Возвращает значение а*Ь+с заданных аргументов
fmax - Возвращает большее из двух значений
fmin - Возвращает меньшее из двух значений
fmod - Возвращает остаток от деления
frexp - Разбивает заданное число на мантиссу и экспоненту
hypot - Возвращает длину гипотенузы при заданных длинах двух катетов
ilogb - Выделяет экспоненциальное значение
ldexp - Возвращает значение выражения num*2^ехр.

Все математические функции реализованы как методы класса Math, основные из которых представлены в таблице 4.1

Таблица 4.1 – Основные поля и методы класса Math

Имя метода

Описание

Пояснения

|x|, записывается как Abs(x)

Арккосинус

Acos(double x), угол задается в радианах

Арксинус

Арктангенс

Арктангенс

Atan2(double x,double y) –угол, тангенс которого есть результат деления y на х

Произведение

BigMul(int x,int y)

Округление до большего целого

Celling(double x)

Гиперболический косинус

Деление и остаток

2,71828182845905

Экспонента

Округление до меньшего целого

Floor(double x)

Остаток от деления

IEEERemainder(double x, double y)

Натуральный логарифм

Десятичный логарифм

Максимум из 2-х чисел

Продолжение таблицы 4.1

Имя метода

Описание

Пояснения

Минимум из 2-х чисел

Значение числа пи

3,14159265358979

Возведение в степень

Pow(x,y) – x в степени y

Округление

Round(3.1)=3 Round(3.8)=4

Знак числа

Гиперболический синус

Квадратный корень

Гиперболический тангенс

Пример линейной программы расчета по заданной формуле

namespace ConsoleApplicationl

{ static void Main()

Console.WriteLine(“Введите x”);

buf=Console.ReadLine();

double x=Convert.ToDouble(buf);

Console.WriteLine(“Введите alfa”);

buf=Console.ReadLine();

double a=double.Parse(buf);

double y=Math.Sqrt(Math.PI*x)-

Math.Exp(0.2*Math.Sqrt(a))+

2*Math.Tan(2*a)+

1.6e3*Math.Log10(Math.Pow(x,2));

Console.WriteLine(“Для х= {0} и alfa ={1}”, x,a);

Console.WriteLine(“Результат =” +y); }}}

Лекция 5. Операторы языка c#

Состав операторов языка C#, их синтаксис и семантика унаследованы от языка С++. Любое выражение, завершающееся точкой с запятой является оператором.

Блок или составной оператор

С помощью фигурных скобок несколько операторов языка (возможно, перемежаемых объявлениями) можно объединить в единую синтаксическую конструкцию, называемую блоком или составным оператором:

оператор_1

оператор_N

Синтаксически блок воспринимается как единичный оператор и может использоваться всюду в конструкциях, где синтаксис требует одного оператора. Тело цикла, ветви оператора if, как правило, представляются блоком.

Пустой оператор

Пустой оператор - это "пусто", завершаемое точкой с запятой. Он используется когда по синтаксису оператор требуется, а по смыслу- нет. Иногда полезно рассматривать отсутствие операторов как существующий пустой оператор. Синтаксически допустимо ставить лишние точки с запятой, полагая, что вставляются пустые операторы. Например, синтаксически допустима следующая конструкция:

for (int j=1; j<5; j++) //оператор цикла

{;;;}; //пустой оператор

Она может рассматриваться как задержка по времени, работа на холостом ходе.

В C++ определены следующие арифметические операторы.

Cложение;

– вычитание;

* умножение

/ деление

% деление по модулю

– – декремент (уменьшение на 1)

Инкремент (увеличение на 1).

Действие операторов +, –, * и / совпадает с действием аналогичных опера­торов в алгебре. Их можно применять к данным любого встроенного числового типа.

После применения оператора деления (/) к целому числу остаток будет отбро­шен. Например, результат целочисленного деления 10/3 будет равен 3. Остаток от деления можно получить с помощью оператора деления по модулю (%). На­пример, 10%3 равно 1. Это означает, что в С++ оператор % нельзя применять к нецелочисленным типам данных.

Операторы инкремента (++) и декремента (– –) обладают очень интересными свойствами. Поэтому им следует уделить особое внимание.

Оператор инкремента выполняет сложение операнда с числом 1, а оператор декремента вычитает 1 из своего операнда. Это значит, что инструкция:

аналогична такой инструкции:

А инструкция:

аналогична такой инструкции:

Операторы инкремента и декремента могут стоять как перед своим операн­дом (префиксная форма), так и после него (постфиксная форма). Например, ин­струкцию

можно переписать в виде префиксной

Х;//префиксная форма оператора инкремента

или постфиксной формы:

х++;//постфиксная форма оператора инкремента

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

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

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

#include

Приведем основные алгебраические функции С++.

abs(x) - модуль целого числа;

labs(x) - модуль «длинного» целого;

fabs(x) - модуль числа с плавающей точкой;

sqrt(x) - извлечение квадратного корня;

pow(x,y) - возведение x в степень y;

cos(x) - косинус;

sin(x) - синус;

tan(x) - тангенс;

acos(x) - арккосинус;

asin(x) - арксинус;

atan(x) - арктангенс;

exp(x) - експонента в степени x;

log(x) - натуральный логарифм;

log10(x) - десятичный логарифм

При возведении числа в дробную степень, знаменатель дробной степени нужно записывать в вещественном виде. Например: квадратный корень из а записывается так: pow(a,1/2.0 )

Продемонстрируем использование функций на примерах.

5. Операторы ввода/вывода на языке С++

Для вывода сообщения на экран используется следующий оператор C++:

cout<<”текст”;

#include

Информация, заключенная в двойные кавычки, яв­ляется сообщением, которое должно быть выведено на экран. В языке C++ любая последовательность симво­лов, заключенная в двойные кавычки, называется стро­кой потому, что она состоит из не­скольких символов, соединяемых вместе в более крупный блок (элемент).

Строка в операторе COUT может содержать так называемые подстановочные символы - символы, которых нет на клавиатуре или они заняты под ключевые символы в тексте программы. Перед каждым таким подстановочным символов ставится символ «\».

Приведем перечень таких символов:

\a – звуковой сигнал

\n – переход на новую строку

\t – горизонтальная табуляция

\v – вертикальная табуляция

\\ - обратный слеш

\’ – одинарная кавычка

\” – двойная кавычка

\? – знак вопроса.

Например, оператор вида:

cout>>“пример\nтекста”;

Слово «пример» выведет на одной строке, а слово «текста» на другой.

Оператор вида:

cout>>“магазин\»”чайка\””;

Слово «Чайка» отобразит в двойных кавычках.

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

cout<<”a=”<

Форматированный вывод

Для выдачи значений заданной длины или точности оператор cout имеет ряд настроек:

    cout.width(число) – общая длина выводимого значения

    cout.precision(число) – число знаков после запятой

    cout.fill(‘символ-заполнитель’) – символ, которым заполняются лишние позиции на экране

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

Настройки этих параметров должны проводиться до вызова оператора вывода.

Например:

//описываем переменные

float a=125.478, b=625.365;

//задаем число знаков поле запятой

cout.precision(2);

//задаем заполнитель для лишний позиций

cout.fill(‘0’);

//выдаем значения переменных на экран

cout<<”a=”;

cout<<” b=”;

//задаем общую длину для числа

Регулировка ширины поля (width) и заполнителя (fill) имеет смысл при выдачи данных в таблицу. Чаще всего можно обойтись только настройкой precision.

Очистка экрана

Язык С++ имеет функцию, позволяющую очищать экран от текстовой информации. Эта функция имеет вид:

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

#include

Организация паузы для просмотра результата

После выполнения программы обычно происходит автоматичский возврат в окно с исходным текстом. Это не позволяет просмотреть результат, который программа выдает на экран. Выходом из этой ситуации может быть использование клавиш Alt+F5, при нажатии на которые происходит скрытие окна с кодом программы. Повторное нажатие на эти клавиши возвращает окно с кодом на экран.

Однако, если создать исполняемый EXE файл, то использовать эти клавиши будет невозможно и результат останется невидимым для пользователя.

Для решения данной проблемы в конце программы можно добавлять функцию, которая приостанавливает работу до нажатия любой клавиши. Эта функция имеет вид:

getch ();

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

#include

Оператор ввода данных с клавиатуры

Для вода данных с клавиатуры в С++ имеется оператор:

cin>>переменная;

Данный оператор приостанавливает работу программы и ждет пока пользователь не введет значение переменной и на нажмет ENTER.

C помощью одного оператора можно ввести значения нескольких переменных. Для этого оператор записывают в виде:

cin>>переменная1>>переменная2>>. . .>>переменнаяn;

При запуске программы каждое значение вводится через пробел и в конце нажимают ENTER.

Оператор COUT находится в заголовочном файле iostream.h. Поэтому для его использования данный файл нужно подключить с помощью директивы:

#include (начало)

6. Пример программы на С++

Для демонстрации решим одну задачу. Составить программу для нахождения значения функции:

Программа может иметь вид:

//подключаем файл для организации ввода/вывода

#include

//подключаем файл для использования алгебраических функций

#include

//подключаем файл для вызова функции очистки экрана

#include

//заголовок главной программы

//описываем три переменных вещественного типа

//очищаем экран

//выдаем текстовую подсказку на экран

cout<<"Введите значения a и b:";

//запрашиваем ввод с клавиатуры двух переменных: a и b

//считаем значение функции

c=sin(a)+pow(cos(b),2);

//устанавливаем точность вывода результата 3 знака полсе запятой

cout.precision(3);

//выводим результат на экран

cout<<"Функция равна:"<

cout<<"Для продолжения нажмите любую клавишу. . .";

//делаем паузу для просмотра результата

//завершаем работу главной программы

Для целых чисел определены операции + , - , * и ** . Операция деления / для целых чисел возвращает вещественное число (значение типа float). Также функция возведения в степень возвращает значение типа float , если показатель степени — отрицательное число.

Но есть и специальная операция целочисленного деления, выполняющегося с отбрасыванием дробной части, которая обозначается // (она соответствует операции div в Паскале). Она возвращает целое число: целую часть частного. Другая близкая ей операция − это операция взятия остатка от деления, обозначаемая % (она соответствует операции mod в Паскале). Например:

Print(17 / 3) # выведет 5.66666666667 print(17 // 3) # выведет 5 print(17 % 3) # выведет 2

Некоторые из перечисленных функций (int , round , abs) являются стандартными и не требуют подключения модуля math для использования.

Функция Описание
Округление
int(x) Округляет число в сторону нуля. Это стандартная функция, для ее использования не нужно подключать модуль math .
round(x) Округляет число до ближайшего целого. Если дробная часть числа равна 0.5, то число округляется до ближайшего четного числа.
round(x, n) Округляет число x до n знаков после точки. Это стандартная функция, для ее использования не нужно подключать модуль math .
floor(x) Округляет число вниз («пол»), при этом floor(1.5) == 1 , floor(-1.5) == -2
ceil(x) Округляет число вверх («потолок»), при этом ceil(1.5) == 2 , ceil(-1.5) == -1
abs(x) Модуль (абсолютная величина). Это — стандартная функция.
Корни, логарифмы
sqrt(x) Квадратный корень. Использование: sqrt(x)
log(x) Натуральный логарифм. При вызове в виде log(x, b) возвращает логарифм по основанию b .
e Основание натуральных логарифмов e = 2,71828...
Тригонометрия
sin(x) Синус угла, задаваемого в радианах
cos(x) Косинус угла, задаваемого в радианах
tan(x) Тангенс угла, задаваемого в радианах
asin(x) Арксинус, возвращает значение в радианах
acos(x) Арккосинус, возвращает значение в радианах
atan(x) Арктангенс, возвращает значение в радианах
atan2(y, x) Полярный угол (в радианах) точки с координатами (x, y).
degrees(x) Преобразует угол, заданный в радианах, в градусы.
radians(x) Преобразует угол, заданный в градусах, в радианы.
pi Константа π = 3.1415...