matherr(3) Library Functions Manual matherr(3) matherr - SVID (libm -lm) #include [[deprecated]] int matherr(struct exception *exc); [[deprecated]] extern _LIB_VERSION_TYPE _LIB_VERSION; : glibc. glibc 2.27 . glibc 2.27 . math_error(7) fenv(3). matherr() . V (SVID) matherr() . matherr() . matherr() _SVID_SOURCE ( ) _SVID_ _LIB_VERSION. matherr(). ( ). matherr() . exception : struct exception { int type; /* */ char *name; /* */ double arg1; /* */ double arg2; /* */ double retval; /* */ } type : DOMAIN ( ). errno EDOM. SING ( ). HUGE ( ) . errno EDOM. OVERFLOW . HUGE errno ERANGE. UNDERFLOW . 0.0 errno ERANGE. TLOSS . 0.0 errno ERANGE. PLOSS . glibc ( ). arg1 arg2 (arg2 ). retval . matherr() . matherr() errno ( ). matherr() errno . matherr() matherr(). "" exc->type matherr(). "" exc->retval. "Msg?" "errno" matherr() . "Msg?" "y" . : x y fin neg int o/f u/f |x| x X_TLOSS Type Msg? errno acos(|x|>1) HUGE y EDOM asin(|x|>1) HUGE y EDOM atan2(0,0) HUGE y EDOM acosh(x<1) NAN y EDOM atanh(|x|>1) NAN y EDOM atanh(|x|==1) (x>0.0)? y EDOM HUGE_VAL : -HUGE_VAL cosh(fin) o/f OVERFLOW HUGE n ERANGE sinh(fin) o/f OVERFLOW (x>0.0) ? n ERANGE HUGE : -HUGE sqrt(x<0) 0.0 y EDOM hypot(fin,fin) o/f OVERFLOW HUGE n ERANGE exp(fin) o/f OVERFLOW HUGE n ERANGE exp(fin) u/f UNDERFLOW 0.0 n ERANGE exp2(fin) o/f OVERFLOW HUGE n ERANGE exp2(fin) u/f UNDERFLOW 0.0 n ERANGE exp10(fin) o/f OVERFLOW HUGE n ERANGE exp10(fin) u/f UNDERFLOW 0.0 n ERANGE j0(|x|>X_TLOSS) TLOSS 0.0 y ERANGE j1(|x|>X_TLOSS) TLOSS 0.0 y ERANGE jn(|x|>X_TLOSS) TLOSS 0.0 y ERANGE y0(x>X_TLOSS) TLOSS 0.0 y ERANGE y1(x>X_TLOSS) TLOSS 0.0 y ERANGE yn(x>X_TLOSS) TLOSS 0.0 y ERANGE y0(0) -HUGE y EDOM y0(x<0) -HUGE y EDOM y1(0) -HUGE y EDOM y1(x<0) -HUGE y EDOM yn(n,0) -HUGE y EDOM yn(x<0) -HUGE y EDOM lgamma(fin) o/f OVERFLOW HUGE n ERANGE lgamma(-int) or HUGE y EDOM lgamma(0) tgamma(fin) o/f OVERFLOW HUGE_VAL n ERANGE tgamma(-int) NAN y EDOM tgamma(0) copysign( y ERANGE HUGE_VAL,x) log(0) -HUGE y EDOM log(x<0) -HUGE y EDOM log2(0) -HUGE n EDOM log2(x<0) -HUGE n EDOM log10(0) -HUGE y EDOM log10(x<0) -HUGE y EDOM pow(0.0,0.0) 0.0 y EDOM pow(x,y) o/f OVERFLOW HUGE n ERANGE pow(x,y) u/f UNDERFLOW 0.0 n ERANGE pow(NaN,0.0) x n EDOM 0**neg 0.0 y EDOM neg**non-int 0.0 y EDOM scalb() o/f OVERFLOW (x>0.0) ? n ERANGE HUGE_VAL : -HUGE_VAL scalb() u/f UNDERFLOW copysign( n ERANGE 0.0,x) fmod(x,0) x y EDOM remainder(x,0) NAN y EDOM attributes(7). +------------+------------------------------------+--------------------+ || | | +------------+------------------------------------+--------------------+ |matherr() | | MT-Safe | +------------+------------------------------------+--------------------+ matherr() log(3). . log(3). _LIB_VERSION _SVID_ matherr() matherr(). matherr() . log(3) 0.0 matherr(): $ ./a.out 0.0 errno: Numerical result out of range x=-inf matherr() 0: $ ./a.out 0.0 0 matherr SING exception in log() function args: 0.000000, 0.000000 retval: -340282346638528859811704183484516925440.000000 log: SING error errno: Numerical argument out of domain x=-340282346638528859811704183484516925440.000000 "log: SING" C. matherr() : $ ./a.out 0.0 1 matherr SING exception in log() function args: 0.000000, 0.000000 retval: -340282346638528859811704183484516925440.000000 x=-340282346638528859811704183484516925440.000000 C errno. matherr() : $ ./a.out 0.0 1 12345.0 matherr SING exception in log() function args: 0.000000, 0.000000 retval: -340282346638528859811704183484516925440.000000 x=12345.000000 #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's return value? */ static double new_retval; /* New function return value */ int matherr(struct exception *exc) { fprintf(stderr, "matherr %s exception in %s() function\n", (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\n", exc->arg1, exc->arg2); fprintf(stderr, " retval: %f\n", 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 " " [ []]\n", 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\n", x); exit(EXIT_SUCCESS); } fenv(3), math_error(7), standards(7) 3 . . : . 6.18 17 2025 matherr(3)