Для чего в программах на с используется заголовочный файл math h

Обновлено: 07.07.2024

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

1. double ceil (double x) : функция библиотеки C double ceil (double x) возвращает наименьшее целочисленное значение, большее или равное x.

float val1, val2, val3, val4;


val1 = 1.6;
val2 = 1.2;
val3 = -2.8;
val4 = -2.3;

printf ( "value1 = %.1lf\n" , ceil (val1));

printf ( "value2 = %.1lf\n" , ceil (val2));

printf ( "value3 = %.1lf\n" , ceil (val3));

printf ( "value4 = %.1lf\n" , ceil (val4));

2. double floor (double x): функция библиотеки C double floor (double x) возвращает наибольшее целочисленное значение, меньшее или равное x.

float val1, val2, val3, val4;

printf ( "Value1 = %.1lf\n" , floor (val1));

printf ( "Value2 = %.1lf\n" , floor (val2));

printf ( "Value3 = %.1lf\n" , floor (val3));

printf ( "Value4 = %.1lf\n" , floor (val4));

3. double fabs (double x) : функция библиотеки C double fabs (double x) возвращает абсолютное значение x.

printf ( "The absolute value of %d is %lf\n" , a, fabs (a));

printf ( "The absolute value of %d is %lf\n" , b, fabs (b));

4. double log (double x) : функция библиотеки C double log (double x) возвращает натуральный логарифм (логарифм base-e) x.

// C код для иллюстрации
// использование функции журнала

/ * поиск журнала (2.7) * /

printf ( "log(%lf) = %lf" , x, ret);

5. double log10 (double x) : функция библиотеки C double log10 (double x) возвращает общий логарифм (логарифм с основанием 10) для x.

/ * поиск значения log1010000 * /

printf ( "log10(%lf) = %lf\n" , x, ret);

6. double fmod (double x, double y) : функция библиотеки C double fmod (double x, double y) возвращает остаток от x, деленный на y.

printf ( "Remainder of %f / %d is %lf\n" , a, c, fmod (a, c));

printf ( "Remainder of %f / %f is %lf\n" , a, b, fmod (a, b));

7. double sqrt (double x) : функция библиотеки C double sqrt (double x) возвращает квадратный корень из x.

printf ( "Square root of %lf is %lf\n" , 225.0, sqrt (225.0) );

printf ( "Square root of %lf is %lf\n" , 300.0, sqrt (300.0) );

8. double pow (double x, double y) : функция библиотеки C double pow (double x, double y) возвращает x, возведенное в степень y, то есть xy.

printf ( "Value 8.0 ^ 3 = %lf\n" , pow (8.0, 3));

printf ( "Value 3.05 ^ 1.98 = %lf" , pow (3.05, 1.98));

9. double modf (double x, double * integer) : функция библиотеки C double modf (double x, double * integer) возвращает компонент дроби (часть после десятичной дроби) и устанавливает целочисленное значение для целочисленного компонента.

double x, fractpart, intpart;

fractpart = modf (x, &intpart);

printf ( "Integral part = %lf\n" , intpart);

printf ( "Fraction Part = %lf \n" , fractpart);

10. double exp (double x) : функция библиотеки C double exp (double x) возвращает значение e, возведенное в x-ю степень.

Следующий код представляет

printf ( "The exponential value of %lf is %lf\n" , x, exp (x));

printf ( "The exponential value of %lf is %lf\n" , x+1, exp (x+1));

printf ( "The exponential value of %lf is %lf\n" , x+2, exp (x+2));

11. double cos (double x) : библиотечная функция C double cos (double x) возвращает косинус радиального угла x.

Примечание: тот же синтаксис может использоваться для других тригонометрических функций, таких как sin, tan и т. Д.

double x, ret, val;

printf ( "The cosine of %lf is %lf degrees\n" , x, ret);

printf ( "The cosine of %lf is %lf degrees\n" , x, ret);

12. double acos (double x): функция библиотеки C double acos (double x) возвращает арккосинус x в радианах.

Примечание: тот же синтаксис может использоваться для других тригонометрических функций дуги, таких как asin, atan и т. Д.

double x, ret, val;

ret = acos (x) * val;

printf ( "The arc cosine of %lf is %lf degrees" , x, ret);

13. double tanh (double x): функция библиотеки C double tanh (double x) возвращает гиперболический тангенс x.

Примечание: тот же синтаксис может использоваться для других гиперболических тригонометрических функций, таких как sinh, cosh и т. Д.

printf ( "The hyperbolic tangent of %lf is %lf degrees" , x, ret);

Пожалуйста, пишите комментарии, если вы обнаружите что-то неправильное, или вы хотите поделиться дополнительной информацией по обсуждаемой выше теме.

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

В языке C++ нужно указывать название заголовочного файла так:

Функция от одного аргумента вызывается, например, так: sin(x) . Вместо числа x может быть любое число, переменная или выражение. Функция возвращает значение, которое можно вывести на экран, присвоить другой переменной или использовать в выражении:

ФункцияОписание
Округление
round Округляет число по правилам арифметики, то есть round(1.5) == 2 , round(-1.5) == -2
floor Округляет число вниз (“пол”), при этом floor(1.5) == 1 , floor(-1.5) == -2
ceil Округляет число вверх (“потолок”), при этом ceil(1.5) == 2 , ceil(-1.5) == -1
trunc Округление в сторону нуля (отбрасывание дробной части), при этом trunc(1.5) == 1 , trunc(-1.5) == -1
fabs Модуль (абсолютная величина)
Корни, степени, логарифмы
sqrt Квадратный корень. Использование: sqrt(x)
cbrt Кубический корень. Использование: cbrt(x)
pow Возведение в степень, возвращает a b . Использование: pow(a,b)
exp Экспонента, возвращает e x . Использование: exp(x)
log Натуральный логарифм
log10 Десятичный логарифм
Тригонометрия
sin Синус угла, задаваемого в радианах
cos Косинус угла, задаваемого в радианах
tan Тангенс угла, задаваемого в радианах
asin Арксинус, возвращает значение в радианах
acos Арккосинус, возвращает значение в радианах
atan Арктангенс, возвращает значение в радианах

Также в файле cmath есть набор полезных числовых констант, например, константа M_PI хранит значение числа \(\pi\).

В компиляторе Visual C++ для использования этих констант необходимо объявить директиву препроцессора _USE_MATH_DEFINES перед подключения заголовочного файла cmath .

Для действительных чисел определены операции сложения, вычитания, умножения и деления.

При этом операция деления выполняется по-разному для переменных и констант целочисленного типа и для переменных и констант действительных типов. В первом случае деление производится нацело с отбрасыванием дробной части, во втором случае — деление производится точно и результатом является действительное число. Более точно, если делимое и делитель одновременно являются целочисленными константами или переменными целочисленных типов, то деление будет целочисленным, а если хотя бы одно из них действительное, то деление будет действительным. Например:

printf("%lf\n", 10 / 3);
printf("%lf\n", 10. / 3);
printf("%lf\n", 10 / 3.);
printf("%lf\n", 10. / 3.);

выведет 3 в первой строке и 3.33333 в остальных строках.

Результат выполнения деления не зависит от того, какой переменной будет присвоен результат. Если написать double a = 10 / 3; , то переменная a будет равна 3, так как деление 10/3 будет целочисленным, независимо от того, чему будет присвоен результат.

Пожалуйста, приостановите работу 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.

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

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

В этой программе есть о чём поговорить. Тригонометрические функции, которые определены в 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

Практика

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


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

Альтернативные объявления математическик функций, позволяющие эффективнее использовать возможности машины, - но, как правило, хуже отслеживающие ошибки и могущие вызывать дополнительные трудности на некоторых машинах, - доступны при подключении 'fastmath.h' вместо 'math.h'.

Существуют четыре различных версии программ математических библиотек: IEEE, POSIX, X/Open, и SVID. Версия может быть выбрана Вами в период прогона программы заданием глобальной переменной _LIB_VERSION, определенной в 'math.h'. Она может принимать значение одной из следующих констант, определенных в 'math.h': _IEEE_, _POSIX_, _XOPEN_, или _SVID_. Переменная _LIB_VERSION не является специальной для каждой части программы, и изменение ее сказывается на всех частях.

Версии библиотеки различаются только по принципу обработки ошибок.

acos вычисляет арккосинус (arccos) от заданного аргумента. Аргумент для acos должен находиться в отрезке [-1,1].

acosf идентичен acos, различие состоит в типах (double и floats), с которыми проводятся вычисления.

acos и acosf возвращают значения в радианах на промежутке от 0 до pi.

Вы можете изменить обработку ошибок для этих функций, используя matherr.

acosh вычисляет обратный гиперболический косинус, который определяется как ln(x + sqrt(sqr(x) - 1))

x должен быть больше либо равен 1.

acoshf аналогичен acosh с точностью до типов.

acosh и acoshf принимают вычисленные значения. Если х меньше 1, возвращается NaN, при этом errno получает значение EDOM.

Вы можете изменить поведение обработчика ошибок с помощью функции matherr, которая не является стандартной ANSI C - функцией.

Ни acosh, ни acoshf не удовлетворяют стандарту ANSI C. Не рекомендуется использовать их в программах, которые могут быть перенесены на другие машины.

asin вычисляет арксинус (arcsin) от заданного аргумента. Аргумент для asin должен находиться в отрезке [-1,1].

asinf идентичен asin, различие состоит в типах (double и float), с которыми проводятся вычисления.

Вы можете изменить обработку ошибок для этих функций, используя matherr.

asin и asinf возвращают значения в радианах в промежутке от -pi/2 до pi/2.

Вы можете изменить обработчик ошибок для этих функций, используя matherr.

asinh вычисляет обратный гиперболический синус, который определяется как sign(x)*ln(ЁxЁ + sqrt(sqr(x) + 1))

asinhf аналогичен с точностью до типов.

asinh и asinhf возвращают вычисленные значения.

Ни asinh, ни asinhf не являются ANSI C - функциями.

atan вычисляет арктангенс (arctg) от заданного аргумента.

atanf аналогичен с точностью до типов.

atan и atanf возвращают значения в радианах на промежутке от -pi/2 до pi/2.

atan удовлетворяет стандарту ANSI C. atanf является расширением.

atan2 вычисляет арктангенс (arctg) от y/x. atan2 получает верный результат даже при углах, близких к pi/2 и -pi/2 (т. е. когда х близок к 0).

atan2f идентичен atan, различие состоит в типах (double и float), с которыми проводятся вычисления.

atan2 и atan2f возвращают значения в радианах на промежутке от -pi/2 до pi/2.

В случае, когда и х и y оба равны нулю, возникает ошибка DOMAIN error.

Вы можете изменить обработку ошибок для этих функций, используя matherr.

atan2 удовлетворяет стандарту ANSI C. atan2f является расширением.

atanh и atanhf возвращают вычисленное значение.

Вы можете изменить обработку ошибок для этих программ, используя matherr.

Ни atanh, ни atanhf не являются ANSI C - функциями.

Функции Бесселя - это семейство функций - решений дифференциального уравнения: Эти функции имеют широкое применение в инженерии и физике.

jn вычисляет функцию Бесселя первого рода порядка n. j0 и j1 представляют собой частные случаи с порядками 0 и 1 соответственно.

Подобно этому, yn вычисляет функцию Бесселя второго рода порядка n, а y0 и y1 - частные случаи с порядками 0 и 1 соответственно.

jnf, j0f, j1f, ynf, y0f, y1f проводят те же самые вычисления, но с переменными типа float.

Каждая функция Бесселя возвращает свое значение в заданной точке х.

Ни одна из этих функций не входит в ANSI C.

Возвращается кубический корень.

сbrt принадлежит System V release 4. cbrtf является расширением.

copysign образует число с абсолютным значением своего первого аргумента х и со знаком своего второго аргумента y.

copysignf производит те же операции, но работает с переменными типа float.

copysign возвращает число типа double с модулем х и знаком y, copysignf возвращает число типа float с модулем х и знаком y.

copysign не входит ни в ANSI C ни в System V Interface Definition, Издание 2.

cosh вычисляет гиперболический косинус от аргумента х, cosh(x) определяется как (exp(x)+exp(-x))/2

Углы определены в радианах. coshf аналогичен с точностью до типов.

cosh и coshf возвращают вычисленное значение. Когда происходит переполнение, cosh возвращает значение HUGE_VAL с соответствующим знаком, глобальная переменная errno принимает значение ERANGE.

Вы можете изменить обработку ошибок для этих программ, используя matherr.

cosh coответствует стандарту ANSI. coshf является расширением.

erf вычисляет приближение к "функции ошибки" , которая оценивает вероятность того, что некое наблюдение окажется внутри рамок отклонения х от среднего значения на числовой оси (подразумевается нормальное вероятностное распределение). Функция ошибки определяется как erfc вычисляет дополнительную вероятность, т. е. erfc(x) = 1 - erf(x). функция erfc вычисляется непосредственно, поэтому используется для избежания потери точности, которая возникла бы при вычитании больших вероятностей (когда x велик) из 1.

erff и erfcf отличаются только типами входных данных и результатов.

Для положительных аргументов erf и все ее разновидности возвращают вероятность - число между 0 и 1.

Ни один из этих вариантов не в ANSI C.

х exp и expf вычисляют значение экспоненты от х, e (где e - основание натуральной системы логарифмов, приблизительно равное 2.71828).

Вы можете использовать функцию matherr (не-ANSI) для выбора обработчика ошибок для этих функций.

В случае успеха exp и expf возвращают вычисленное значение. Если результат слишком мал, возвращается значение 0. Если результат слишком велик, возвращается значение HUGE_VAL. В обоих случаях errno принимает значение ERANGE.

exp coответствует стандарту ANSI. expf является расширением.

expm1 и expm1f вычисляют значение экспоненты от х и вычитают 1, т. е. е в степени х, минус 1. (где e - основание натуральной системы логарифмов, приблизительно равное 2.71828). Результат остается точным даже для малых значениях х, в то время как использование exp(x)-1 вызвало бы потерю многих значащих цифр.

Ни expм1, ни expm1f не соответствуют стандарту ANSI и System V Interface Definition.

fabs и fabsf вычисляют ЁxЁ, абсолютное значение (модуль) от аргумента х. непосредственным обращением к битовому представлению аргумента.

Возвращается вычисленное значение. Никаких ошибок не возникает.

fabs coответствует стандарту ANSI. fabsf является расширением.

floor и floorf вычисляют ближайшее целое значение, не превосходящее х. ceil и ceilf вычисляют ближайшее целое значение, не меньшее х.

floor и ceil возвращают вычисленное значение типа double. floorf и ceilf возвращают вычисленное значение типа float.

floor и ceil coответствуют стандарту ANSI. floorf и ceilf являются расширениями.

fmod и fmodf вычисляют остаток от деления х/у в формате плавающей точки (х ( mod y)).

Функция fmod возвращает значение x-i*y, для наибольшего такого i, что если y отличен от 0, результат имеет тот же знак, что и х, а по модулю не превосходит модуля y.

fmod(x,0) возвращает NaN, errno присваивается значение EDOM.

Вы можете изменить обработчик ошибок для этих функций, используя matherr.

fmod coответствует стандарту ANSI. fmodf является расширением.

Все ненулевые нормализованные числа можно представить в виде m*(2**p) . frexp разбивает переменную типа double val на мантиссу m и степень двойки р. В результате мантисса всегда будет больше 0.5 и меньше чем 1.0 (поскольку val не ноль). Степень двойки хранится в переменной *exp.

m и р вычисляются так что

frexp возвращает мантиссу m. Если val = 0 или NaN, frexp присваивает *exp значение 0, и возвращает val.

frexp coответствует стандарту ANSI. frexpf является расширением.

gamma вычисляет ln(Г(х)), натуральный логарифм от гамма-функции от х. Гамма-функция (exp(gamma(x)) eсть обобщение факториала и использует то свойство, что Г(N) = N*Г(N-1). В соответствии с этим, значения гамма-функции растут очень быстро. gamma определяется как ln(Г(х)) а не как просто Г(х) для того чтобы расширить полезное поле представляемых результатов.

Знак результата сохраняется в глобальной переменной signgam, которая объявлена в math.h.

gammaf производит те же вычисления, что и gamma, но оперирует с переменными типа float.

lgamma и lgammaf - это альтернативные названия для gamma и gammaf. Они существуют в качестве напоминания о том, что вычисляется не сама гамма-функцию, а логарифм от нее.

Функции gamma_r, gammaf_r, lgamma_r и lgammaf_r подобны функциям gamma, gammaf, lgamma, lgammaf соответственно, но требуют лишний аргумент. Этот аргумент - указатель на целое число. Он используется для получения знака результата, и глобальная переменная signgam не используется. Эти функции могут быть использованы для входных заявок (но они, тем не менее, будут задавать значение глобальной переменной errno в случае возникновения ошибки).

Не путайте функцию gamma_r, которая запрашивает дополнительный аргумент, являющийся указателем на целое, с функцией _gamma_r, которая запрашивает дополнительный аргумент, являющийся указателем на структуру повторной входимости.

В случае успеха возвращается вычисленное значение.

Когда х - неположительное число, gamma возвращает HUGE_VAL, а errno принимает значение EDOM. Если происходит переполнение, gamma возвращает HUGE_VAL, а errno принимает значение ERANGE.

Вы можете изменить обработчик ошибок для этих функций, используя matherr.

Ни gamma, ни gammaf не являются ANSI C - функциями.

hypot вычисляет евклидово расстояние sqrt( x**2 + y**2 ) между началом координат и точкой, представленной декартовыми координатами (х, y). hypotf отличается только типом аргументов и результата.

В случае успеха возвращается расстояние. При переполнении hypot возвращает HUGE_VAL и присваивает переменной errno значение ERANGE.

Эта обработка ошибок может быть изменена с помощью функции matherr.

Ни hypot, ни hypotf не являются ANSI C - функциями.

Все ненулевые нормальные числа могут быть представлены в р виде m*2 . ilogb и ilogbf запрашивают аргумент val и возвращают число p. Функции frexp и frexpf подобны функциям ilogb и ilogbf, но помимо этого возвращают m.

ilogb и ilogbf возвращают степень двойки, которая используется для образования числа с плавающей точкой. Если аргумент равен 0, они возвращают -INT_MAX (INT_MAX определен в limits.h). Если val равен бесконечности или NaN, они возвращают INT_MAX.

Ни ilogb, ни ilogbf не входят в ANSI C и System V Interface Definition.

infinity и infinityf возвращают специальное значение, объявленное в IEEE двойной и единичнойной точности соответственно. Эти функции выдают информацию о заданном аргументе - числе с плавающей точкой.

Существует пять основных форматов чисел: zero

число, все биты которого - нули.

используется для представления чисел с нулевым показателем, но ненулевой дробью.

Число с показателем степени и с дробной частью.

Число с показателем, состоящим из одних единиц (в битовом представлении) и нулевой дробью.

Число с показателем, состоящим из одних единиц, и ненулевой дробью.

isnan возвращает 1, если аргумент равен nan. isinf возвращает 1, если аргумент равен infinity. finite возвращает 1, если аргумент равен zero, subnormal или normal. isnanf, isinff и finitef производят те же действия, что и их аналоги isnan, isinf и finite, но с одноразрядными числами с плавающей точкой.

ldexp вычисляет величину val*(p**exp). ldexpf аналогична с точностью до типов.

ldexp и ldexpf возвращают вычисленные значения.

При переполнении в обе стороны переменной errno присваивается значение ERANGE. При переполнении в отрицательную сторону ldexp и ldexpf приобретают значение 0.0. При переполнении в положительную сторону ldexp становится равной HUGE_VAL со знаком плюс или минус.

ldexp удовлетворяет стандарту ANSI C. ldexpf является расширением.

Возвращают значение натурального логарифма от х, то есть логарифм по основанию e ( где e - основание натуральной системы логарифмов, 2.71828. ). log и logf идентичны с точностью до типов входных и выходных данных.

Вы можете изменить обработку ошибок для этих функций, используя matherr.

В случае успеха возвращается вычисленное значение. Если х равен нулю, получаемое значение функции будет -HUGE_VAL а переменная errno станет равной EDOM. Переиначить поведение обработчика ошибок можно использованием matherr.

log удовлетворяет стандарту ANSI C. logf является расширением.

log10 возвращает значение логарифма по основанию 10 от х. Он определяется как ln(х)/ln(10).

logf идентичен с точностью до входных и выходных типов.

Обе функции возвращают вычисленные значения.

Для получения справки об ошибках, обратитесь к разделу, описывающему log.

log удовлетворяет стандарту ANSI C. logf является расширением.

log1p возвращает значение ln(1+x), натурального логарифма от 1+х. Предпочтительнее использовать именно log1p а не log(1+x) для большей точности вычислений при достаточно малых x.

log1pf идентичен с точностью до входных и выходных типов.

Обе функции возвращают вычисленные значения, - каждый соответствующего типа.

Ни log1p, ни log1pf не входят в ANSI C и System V Interface Definition.

matherr вызывается всегда, когда функция из математической библиотеки генерирует ошибку. Вы можете видоизменить matherr своей собственной подпрограммой для того, чтобы выбрать необходимое обращение с ошибками. Выбранный matherr должен выдавать 0, если ему не удается распознать ошибку, и число, отличное от нуля в противном случае.

Ниже представлена структура exception (определенная в 'math.h'):

Поля структуры exception имеют следующие значения: type

Тип произошедшей ошибки. Множество закодированных типов ошибок также находится в 'math.h'.

Указатель на строку, заканчивающуюся нулем, содержащую имя той функции из математической библиотеки, в которой произошла ошибка.

Аргументы, вызвавшие ошибку.

Возвращаемое значение ошибки (то значение, которое будет иметь вызываемая функция).

Если не ноль, то это новое значение, присвоенное errno. Типы ошибок, определенные в 'math.h' представлают собой возможные математические ошибки типа: DOMAIN

Аргумент не в области определения функции; например log(-1.0).

Предполагаемые вычисления привели бы к появлению особой точки, например pow(0.0, -2.0).

Вычисления привели бы к результату слишком большому для представления, например exp(1000.0).

Вычисления привели бы к результату слишком маленькому для представления, например exp(-1000.0).

Полная потеря разрядности. Результат не имел бы значащих цифр, например sin(10e70).

Частичная потеря разрядности. Библиотечное определение matherr возвращает 0 во всех случаях.

Вы можете изменить результат вызываемой функции совершив в matherr изменение e->retval; этот результат передается к источнику вызова.

matherr - не ANSI-функция.

modf разделяет переменную val типа double на целую и дробную части, возвращая дробную часть и сохраняя целую в *ipart. Не происходит никакого округления, сумма дробной и целой частей гарантированно составит val. То есть, если realpart = mod(val, &intpart); тогда 'realpart + intpart' в точности будет равняться val.

modff идентичен с точностью до типов.

Возвращается дробная часть. Знак результата совпадает со знаком исходного аргумента val.

modf удовлетворяет стандарту ANSI C. modff является расширением.

nan и nanf возвращают NaN, определенный в IEEE, двойной и одинарной точности соответственно. nextafter возвращает число с плавающей точкой двойной точности ближайшее к val в направлении к числу dir. nextafterf производит те же действия с одинарной точостью. Например, nextafter(0.0,1.0) возвращает наименьшее положительное число двойной точности.

возвращает число ближайшее к val в направлении к dir число.

Ни nextafter, ни nextafterf не входят в ANSI C и System V Interface Definition.

В случае успеха возвращается вычисленное значение.

Когда происходит переполнение, pow возвращает HUGE_VAL а errno получает значение ERANGE. Ecли входной х отрицателен, а y - не целое число, тогда errno принимает значение EDOM. Если оба аргумента равны 0, pow и powf возвращают 1.

Вы можете изменить обработку ошибок для этих функций, используя matherr.

pow отвечает стандарту ANSI C. powf является расширением.

rint и rintf возвращают свой аргумент, округленный до ближайшего целого. remainder и remainderf находят остаток от деления x/y; это будет число между -y/2 и y/2.

rint и remainder возвращают целое значение в виде double.

rint и remainder входят в System V release. rintf и remainderf являются расширениями.

scalbn и scalbnf производят операцию масштабирования, возвращая двойку в степени n, взятую х раз. Результат высчитываетсся посредством манипуляций с экспонентой, а не через стандартные возведения в степень и перемножение. Ни scale, ни scalef не входят в ANSI C и System V Interface Definition. sqrt вычисляет арифметический (неотрицательный) квадратный корень из аргумента.

Вы можете изменить обработку ошибок для этих функций, используя matherr.

В случае успеха возвращается вычисленное значение квадратного корня. Если х веществененный и неотрицательный, результат неотрицателен. Если х вещественный и отрицательный, переменной errno присваивается значение EDOM (ошибка DOMAIN error).

sqrt удовлетворяет стандарту ANSI C. sqrtf является расширением.

sin и cos вычисляют (соответственно) синус и косинус от аргумента х. Углы определены в радианах.

sinf и cosf аналогичны с точностью до типов.

Возвращается значение синуса или косинуса.

sin и cos отвечают стандарту ANSI C. sinf и cosf являются расширением.

sinh вычисляет гиперболический синус от аргумента х. Углы определены в радианах.

sinh(x) определяется как (exp(x)-exp(-x))/2

sinhf аналогичен с точностью до типов.

sinh и sinhf возвращают вычисленное значение.

Когда происходит переполнение (результат слишком велик), sinh возвращает значение HUGE_VAL с соответствующим знаком, глобальная переменная errno принимает значение ERANGE.

Вы можете изменить обработку ошибок для этих программ, используя matherr.

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

Заголовочные файлы из Стандартной библиотеки C++

Рассмотрим следующую программу:

Результат выполнения программы:

Как правило, в заголовочных файлах записываются только объявления, без определений. Следовательно, если cout только объявлен в заголовочном файле iostream, то где же он определяется? Ответ: в Стандартной библиотеке С++, которая автоматически подключается к вашему проекту на этапе линкинга.


Пишем свои собственные заголовочные файлы

Теперь давайте вернемся к примеру, который мы обсуждали на предыдущем уроке. У нас было два файла: add.cpp и main.cpp.

int add ( int x , int y ) ; // предварительное объявление с использованием прототипа функции std :: cout << "The sum of 3 and 4 is " << add ( 3 , 4 ) << std :: endl ;

Примечание: Если вы создаете все файлы заново, то не забудьте добавить add.cpp в свой проект, чтобы он был подключен к компиляции.

И здесь нам на помощь приходят заголовочные файлы. Достаточно просто написать один заголовочный файл и его можно будет повторно использовать в любом количестве программ. Также и вносить изменения в такой код (например, добавление еще одного параметра) гораздо легче, нежели чем шерстить по всем файлам в поисках используемых функций.

Написать свой собственный заголовочный файл не так уж и сложно. Заголовочные файлы состоят из двух частей:

Директивы препроцессора — в частности, header guards, которые предотвращают вызов заголовочного файла больше одного раза из одного и того же файла (об этом детально на следующем уроке).

Содержимое заголовочного файла — набор объявлений.

Все ваши заголовочные файлы (которые вы написали самостоятельно) должны иметь расширение .h .

// Начнем с директив препроцессора. ADD_H – это произвольное уникальное имя (обычно используется имя заголовочного файла) int add ( int x , int y ) ; // прототип функции add() (не забывайте точку с запятой в конце!)

Чтобы использовать этот файл в main.cpp, вам сначала нужно будет подключить его к проекту.

main.cpp, в котором мы подключаем add.h:

std :: cout << "The sum of 3 and 4 is " << add ( 3 , 4 ) << std :: endl ;

add.cpp остается без изменений:

Если вы получили ошибку от линкера, что функция аdd() не определена, то убедитесь, что вы корректно подключили add.cpp к вашему проекту (и к компиляции тоже)!

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

Почему iostream пишется без окончания .h?

Когда C++ только создавался, все файлы библиотеки Runtime имели окончание .h. Оригинальные версии cout и cin объявлены в iostream.h. При стандартизации языка С++ комитетом ANSI, решили перенести все функции из библиотеки Runtime в пространствo имен std, чтобы предотвратить возможность возникновения конфликтов имен с пользовательскими идентификаторами (что, между прочим, является хорошей идеей). Тем не менее, возникла проблема: если все функции переместить в пространство имен std, то старые программы переставали работать!

Когда вы подключаете заголовочный файл из Стандартной библиотеки C++, убедитесь, что вы используете версию без .h (если она существует). В противном случае, вы будете использовать устаревшую версию заголовочного файла, который уже больше не поддерживается.

Кроме того, многие библиотеки, унаследованные от языка Cи, которые до сих пор используются в C++, также были продублированы с добавлением префикса c (например, stdlib.h стал cstdlib). Функционал этих библиотек также перенесли в пространство имен std, чтобы избежать возможность возникновения конфликтов имен с пользовательскими идентификаторами.

Можно ли записывать определения в заголовочных файлах?

Язык C++ не будет жаловаться, если вы это сделаете, но так делать не принято.

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

Советы

Вот несколько советов по написанию собственных заголовочных файлов:

Всегда используйте директивы препроцессора.

Не определяйте переменные в заголовочных файлах, если это не константы. Заголовочные файлы следует использовать только для объявлений.

Читайте также: