Matherr - изменяемый обработчик математических ошибок
matherr вызывается всегда, когда функция из математической библиотеки генерирует ошибку. Вы можете видоизменить matherr своей собственной подпрограммой для того, чтобы выбрать необходимое обращение с ошибками. Выбранный matherr должен выдавать 0, если ему не удается распознать ошибку, и число, отличное от нуля в противном случае.
Когда matherr принимает ненулевое значение, сообщение об ошибке не выводится, и значение errno не изменяется. Вы можете подстроить под себя одно или оба этих обстоятельства в своей версии matherr, используя ту информацию, что содержится в структуре *e.
Ниже представлена структура exception (определенная в 'math.h'):
struct exception { int type; char *name; double arj1, arj2, retval; int err; };Поля структуры exception имеют следующие значения:
Type
Тип произошедшей ошибки. Множество закодированных типов ошибок также находится в 'math.h'.
Name
Указатель на строку, заканчивающуюся нулем, содержащую имя той функции из математической библиотеки, в которой произошла ошибка.
Arj1, arj2
Аргументы, вызвавшие ошибку.
Retval
Возвращаемое значение ошибки (то значение, которое будет иметь вызываемая функция).
Err
Если не ноль, то это новое значение, присвоенное errno.
Типы ошибок, определенные в 'math.h' представлают собой возможные математические ошибки типа:
DOMAIN
Аргумент не в области определения функции; например log(-1.0).
SING
Предполагаемые вычисления привели бы к появлению особой точки, например pow(0.0, -2.0).
OVERFLOW
Вычисления привели бы к результату слишком большому для представления, например exp(1000.0).
UNDERFLOW
Вычисления привели бы к результату слишком маленькому для представления, например exp(-1000.0).
TLOSS
Полная потеря разрядности. Результат не имел бы значащих цифр, например sin(10e70).
PLOSS
Частичная потеря разрядности.
Библиотечное определение matherr возвращает 0 во всех случаях.
Вы можете изменить результат вызываемой функции совершив в matherr изменение e->retval; этот результат передается к источнику вызова.
Если функций matherr возвращает 0 (что означает неспособность разрешить ошибку), источник вызова присваивает errno необходимоеое значение и выводит сообщение об ошибке.
matherr - не ANSI-функция.
Modf, modff - разбиение на дробную и целую части
#include <math.h> double modf(double val, double *ipart); float modff(float val, float *ipart);modf разделяет переменную val типа double на целую и дробную части, возвращая дробную часть и сохраняя целую в *ipart. Не происходит никакого округления, сумма дробной и целой частей гарантированно составит val. То есть, если realpart = mod(val, &intpart); тогда 'realpart + intpart' в точности будет равняться val.
modff идентичен с точностью до типов.
Возвращается дробная часть. Знак результата совпадает со знаком исходного аргумента val.
modf удовлетворяет стандарту ANSI C. modff является расширением.
Nan, nanf - представление бесконечности
#include <math.h> double nan(void); float nanf(void);nan и nanf возвращают NaN, определенный в IEEE, двойной и одинарной точности соответственно.
Nextafter, nextafterf - получение ближайшего числа
#include <math.h> double nextafter(double val, double dir); float nextafterf(float val, float dir);nextafter возвращает число с плавающей точкой двойной точности ближайшее к val в направлении к числу dir. nextafterf производит те же действия с одинарной точостью. Например, nextafter(0.0,1.0) возвращает наименьшее положительное число двойной точности.
возвращает число ближайшее к val в направлении к dir число.
Ни nextafter, ни nextafterf не входят в ANSI C и System V Interface Definition.
Pow, powf - x в степени y
#include <math.h> double pow(double x, double y); float powf(float x, float y);pow и powf вычисляют x в степени y.
В случае успеха возвращается вычисленное значение.
Когда происходит переполнение, pow возвращает HUGE_VAL а errno получает значение ERANGE. Ecли входной х отрицателен, а y - не целое число, тогда errno принимает значение EDOM. Если оба аргумента равны 0, pow и powf возвращают 1.
Вы можете изменить обработку ошибок для этих функций, используя matherr.
pow отвечает стандарту ANSI C. powf является расширением.