.\" -*- coding: UTF-8 -*- '\" t .\" Copyright (c) 2008, Linux Foundation, written by Michael Kerrisk .\" .\" .\" SPDX-License-Identifier: Linux-man-pages-copyleft .\" .\"******************************************************************* .\" .\" This file was generated with po4a. Translate the source file. .\" .\"******************************************************************* .TH matherr 3 "20 июля 2023 г." "Linux man\-pages 6.05.01" .SH ИМЯ matherr \- библиотека SVID для обработки математических исключений .SH LIBRARY Math library (\fIlibm\fP, \fI\-lm\fP) .SH СИНТАКСИС .nf \fB#include \fP .PP \fB[[deprecated]] int matherr(struct exception *\fP\fIexc\fP\fB);\fP .PP \fB[[deprecated]] extern _LIB_VERSION_TYPE _LIB_VERSION;\fP .fi .SH ОПИСАНИЕ .\" glibc commit 813378e9fe17e029caf627cab76fe23eb46815fa \fIЗамечание\fP: механизм, описанный на этой странице, больше не поддерживается glibc. До glibc 2.27 он был помечен как устаревший. Начиная с glibc 2.27, механизм был полностью удалён. В новых приложениях нужно использовать методы, описанные в \fBmath_error\fP(7) и \fBfenv\fP(3). На этой странице описан механизм \fBmatherr\fP() с целью сопровождения и переноса старых приложений. .PP В System V Interface Definition (SVID) определено какие математические функции должны вызывать функцию \fBmatherr\fP(), если обнаруживается математическое исключение. Эта функция вызывает до возврата из самой математической функции; после возврата из \fBmatherr\fP() система возвращается в математическую функцию, которая, в свою очередь, возвращает управление вызывающему. .PP Чтобы задействовать \fBmatherr\fP(), программист должен определить макрос тестирования свойств \fB_SVID_SOURCE\fP (до включения \fIкаких\-либо\fP заголовочных файлов) и присвоить значение \fB_SVID_\fP внешней переменной \fB_LIB_VERSION\fP. .PP Система предоставляет \fBmatherr\fP() как версию по умолчанию. Эта версия ничего не делает возвращает ноль (назначение этого смотрите далее). Версия по умолчанию \fBmatherr\fP() может быть перезаписана версией программиста, которая будет вызываться при возникновении исключений. Функция вызывается с одним аргументом, указателем на структуру \fIexception\fP, определённую следующим образом: .PP .in +4n .EX struct exception { int type; /* тип исключения */ char *name; /* имя функции, вызвавшей исключение */ double arg1; /* 1\-й аргумент функции */ double arg2; /* 2\-й аргумент функции */ double retval; /* значение, возвращаемое функцией */ } .EE .in .PP В поле \fItype\fP может быть одно из следующих значений: .TP 12 \fBDOMAIN\fP Произошла ошибка области (аргумент функции вне диапазона, для которого определена функция). Возвращаемое значение зависит от функции; \fIerrno\fP присваивается \fBEDOM\fP. .TP \fBSING\fP Произошла ошибка особой точки (результат функции равен бесконечности). Возвращаемое значение, в большинстве случаев, равно \fBHUGE\fP (самое большое число с плавающей запятой одинарной точности) с соответствующим знаком. В большинстве случаев, \fIerrno\fP присваивается \fBEDOM\fP. .TP \fBOVERFLOW\fP Возникло переполнение. В большинстве случаев, возвращается значение \fBHUGE\fP и \fIerrno\fP присваивается \fBERANGE\fP. .TP \fBUNDERFLOW\fP Произошла потеря значимости. Возвращается 0.0 и \fIerrno\fP присваивается \fBERANGE\fP. .TP \fBTLOSS\fP Полная потеря значимости. Возвращается 0.0 и \fIerrno\fP присваивается \fBERANGE\fP. .TP \fBPLOSS\fP Частичная потеря значимости. Это значение не используется в glibc (и многих других системах). .PP Поля \fIarg1\fP и \fIarg2\fP это значения аргументов, переданных функции (\fIarg2\fP не определено для функций, у которых только один аргумент). .PP В поле \fIretval\fP указывается возвращаемое значение, которое математическая функция вернёт вызывающему. Написанная программистом \fBmatherr\fP() может изменить этого поле, чтобы вернуть другое значение из математической функции. .PP Если функция \fBmatherr\fP() возвращает ноль, то система изменяет \fIerrno\fP как описано выше и может вывести сообщение об ошибке в стандартный поток ошибок (смотрите далее). .PP Если функция \fBmatherr\fP() возвращает ненулевое значение, то система не изменяет \fIerrno\fP и не печатает сообщение об ошибке. .SS "Математические функции, которые используют matherr()" В таблице далее перечислены функции и обстоятельства вызова \fBmatherr\fP(). В столбце «тип» показано значение, назначаемое \fIexc\->type\fP, когда вызывается \fBmatherr\fP(). В столбце «результат» содержится возвращаемое значение по умолчанию. назначаемое \fIexc\->retval\fP. .PP В столбцах «сообщение?» и «errno» описано поведение по умолчанию, если \fBmatherr\fP() возвращает ноль. Если в «сообщение?» указано «y», то система выводит сообщение об ошибке в стандартный поток ошибок. .PP В таблице используются следующие обозначения и сокращения: .PP .RS .TS l l. x first argument to function y second argument to function fin finite value for argument neg negative value for argument int integral value for argument o/f result overflowed u/f result underflowed |x| absolute value of x X_TLOSS is a constant defined in \fI\fP .TE .RE .\" Details below from glibc 2.8's sysdeps/ieee754/k_standard.c .\" A subset of cases were test by experimental programs. .TS lB lB lB cB lB l l l c l. функция тип результат Сообщение? errno acos(|x|>1) DOMAIN HUGE и EDOM asin(|x|>1) DOMAIN HUGE и EDOM atan2(0,0) DOMAIN HUGE и EDOM .\" retval is 0.0/0.0 acosh(x<1) DOMAIN NAN и EDOM .\" retval is 0.0/0.0 atanh(|x|>1) DOMAIN NAN и EDOM .\" retval is x/0.0 atanh(|x|==1) SING (x>0.0)? и EDOM \ \ HUGE_VAL : \ \ \-HUGE_VAL cosh(fin) o/f OVERFLOW HUGE н ERANGE sinh(fin) o/f OVERFLOW (x>0.0) ? н ERANGE \ \ HUGE : \-HUGE sqrt(x<0) DOMAIN 0.0 и EDOM hypot(fin,fin) o/f OVERFLOW HUGE н ERANGE exp(fin) o/f OVERFLOW HUGE н ERANGE exp(fin) u/f UNDERFLOW 0.0 н ERANGE exp2(fin) o/f OVERFLOW HUGE н ERANGE exp2(fin) u/f UNDERFLOW 0.0 н ERANGE exp10(fin) o/f OVERFLOW HUGE н ERANGE exp10(fin) u/f UNDERFLOW 0.0 н ERANGE j0(|x|>X_TLOSS) TLOSS 0.0 и ERANGE j1(|x|>X_TLOSS) TLOSS 0.0 и ERANGE jn(|x|>X_TLOSS) TLOSS 0.0 и ERANGE y0(x>X_TLOSS) TLOSS 0.0 и ERANGE y1(x>X_TLOSS) TLOSS 0.0 и ERANGE yn(x>X_TLOSS) TLOSS 0.0 и ERANGE y0(0) DOMAIN \-HUGE и EDOM y0(x<0) DOMAIN \-HUGE и EDOM y1(0) DOMAIN \-HUGE и EDOM y1(x<0) DOMAIN \-HUGE и EDOM yn(n,0) DOMAIN \-HUGE и EDOM yn(x<0) DOMAIN \-HUGE и EDOM lgamma(fin) o/f OVERFLOW HUGE н ERANGE lgamma(\-int) или SING HUGE и EDOM \ \ lgamma(0) tgamma(fin) o/f OVERFLOW HUGE_VAL н ERANGE tgamma(\-int) SING NAN и EDOM tgamma(0) SING copysign( и ERANGE \ \ HUGE_VAL,x) log(0) SING \-HUGE и EDOM log(x<0) DOMAIN \-HUGE и EDOM .\" different from log() log2(0) SING \-HUGE н EDOM .\" different from log() log2(x<0) DOMAIN \-HUGE н EDOM log10(0) SING \-HUGE и EDOM log10(x<0) DOMAIN \-HUGE и EDOM pow(0.0,0.0) DOMAIN 0.0 и EDOM pow(x,y) o/f OVERFLOW HUGE н ERANGE pow(x,y) u/f UNDERFLOW 0.0 н ERANGE pow(NaN,0.0) DOMAIN x н EDOM .\" +0 and -0 0**neg DOMAIN 0.0 и EDOM neg**non\-int DOMAIN 0.0 и EDOM scalb() o/f OVERFLOW (x>0.0) ? н ERANGE \ \ HUGE_VAL : \ \ \-HUGE_VAL scalb() u/f UNDERFLOW copysign( н ERANGE \ \ \ \ 0.0,x) fmod(x,0) DOMAIN x и EDOM .\" retval is 0.0/0.0 remainder(x,0) DOMAIN NAN и EDOM .TE .SH АТРИБУТЫ Описание терминов данного раздела смотрите в \fBattributes\fP(7). .TS allbox; lbx lb lb l l l. Интерфейс Атрибут Значение T{ .na .nh \fBmatherr\fP() T} Безвредность в нитях MT\-Safe .TE .sp 1 .SH ПРИМЕРЫ В примере программы показано использование \fBmatherr\fP() при вызове \fBlog\fP(3). Программа имеет три аргумента командной строки. Первый аргумент — число с плавающей запятой, передаваемое в \fBlog\fP(3). Если указан необязательный второй аргумент, то \fB_LIB_VERSION\fP присваивается значение \fB_SVID_\fP для того, чтобы вызывалась \fBmatherr\fP(), и указанное в командной строке целое число используется как возвращаемое значение \fBmatherr\fP(). Если указан необязательный третий аргумент, то им определяется альтернативное возвращаемое значение, которое \fBmatherr\fP() должна вернуть как результат математической функции. .PP Пример запуска, где в \fBlog\fP(3) передаётся аргумент 0.0 и не используется \fBmatherr\fP(): .PP .in +4n .EX $\fB ./a.out 0.0\fP errno: Числовой результат вне представимого диапазона x=\-inf .EE .in .PP В следующем примере вызывается функция \fBmatherr\fP() и возвращает 0: .PP .in +4n .EX $\fB ./a.out 0.0 0\fP исключение matherr SING в функции log() арг: 0.000000, 0.000000 возвр.знач.: \-340282346638528859811704183484516925440.000000 log: SING error errno: Числовой аргумент вне области функции x=\-340282346638528859811704183484516925440.000000 .EE .in .PP Сообщение «log: SING error» выдаётся библиотекой Си. .PP В следующем примере вызывается функция \fBmatherr\fP() и возвращается не нулевое значение: .PP .in +4n .EX $\fB ./a.out 0.0 1\fP исключение matherr SING в функции log() арг: 0.000000, 0.000000 возвр.знач.: \-340282346638528859811704183484516925440.000000 x=\-340282346638528859811704183484516925440.000000 .EE .in .PP В этом случае библиотека Си не печатает сообщение, и значение \fIerrno\fP не изменяется. .PP В следующем примере вызывается функция \fBmatherr\fP(), изменяется возвращаемое значение математической функции и возвращается ненулевое значение: .PP .in +4n .EX $\fB ./a.out 0.0 1 12345.0\fP исключение matherr SING в функции log() арг: 0.000000, 0.000000 возвр.знач.: \-340282346638528859811704183484516925440.000000 x=12345.000000 .EE .in .SS "Исходный код программы" .\" [[deprecated]] SRC BEGIN (matherr.c) \& .EX #define _SVID_SOURCE #include #include #include #include \& static int matherr_ret = 0; /* Value that matherr() should return */ static int change_retval = 0; /* Should matherr() change function\[aq]s return value? */ static double new_retval; /* New function return value */ \& int matherr(struct exception *exc) { fprintf(stderr, "matherr %s exception in %s() function\en", (exc\->type == DOMAIN) ? "DOMAIN" : (exc\->type == OVERFLOW) ? "OVERFLOW" : (exc\->type == UNDERFLOW) ? "UNDERFLOW" : (exc\->type == SING) ? "SING" : (exc\->type == TLOSS) ? "TLOSS" : (exc\->type == PLOSS) ? "PLOSS" : "???", exc\->name); fprintf(stderr, " args: %f, %f\en", exc\->arg1, exc\->arg2); fprintf(stderr, " retval: %f\en", exc\->retval); \& if (change_retval) exc\->retval = new_retval; \& return matherr_ret; } \& int main(int argc, char *argv[]) { double x; \& if (argc < 2) { fprintf(stderr, "Usage: %s " " [ []]\en", argv[0]); exit(EXIT_FAILURE); } \& if (argc > 2) { _LIB_VERSION = _SVID_; matherr_ret = atoi(argv[2]); } \& if (argc > 3) { change_retval = 1; new_retval = atof(argv[3]); } \& x = log(atof(argv[1])); if (errno != 0) perror("errno"); \& printf("x=%f\en", x); exit(EXIT_SUCCESS); } .EE .\" SRC END .SH "СМ. ТАКЖЕ" \fBfenv\fP(3), \fBmath_error\fP(7), \fBstandards\fP(7) .PP .SH ПЕРЕВОД Русский перевод этой страницы руководства был сделан aereiae , Alexey , Azamat Hackimov , Dmitriy S. Seregin , Dmitry Bolkhovskikh , ITriskTI , Max Is , Yuri Kozlov , Иван Павлов и Малянов Евгений Викторович . .PP Этот перевод является бесплатной документацией; прочитайте .UR https://www.gnu.org/licenses/gpl-3.0.html Стандартную общественную лицензию GNU версии 3 .UE или более позднюю, чтобы узнать об условиях авторского права. Мы не несем НИКАКОЙ ОТВЕТСТВЕННОСТИ. .PP Если вы обнаружите ошибки в переводе этой страницы руководства, пожалуйста, отправьте электронное письмо на .MT man-pages-ru-talks@lists.sourceforge.net .ME .