]> git.ipfire.org Git - thirdparty/man-pages.git/blame - man3/matherr.3
fanotify_init.2, fanotify.7: Document FAN_REPORT_TID
[thirdparty/man-pages.git] / man3 / matherr.3
CommitLineData
5f1f495c
MK
1'\" t
2.\" Copyright (c) 2008, Linux Foundation, written by Michael Kerrisk
3.\" <mtk.manpages@gmail.com>
4.\"
93015253 5.\" %%%LICENSE_START(VERBATIM)
5f1f495c
MK
6.\" Permission is granted to make and distribute verbatim copies of this
7.\" manual provided the copyright notice and this permission notice are
8.\" preserved on all copies.
9.\"
10.\" Permission is granted to copy and distribute modified versions of this
11.\" manual under the conditions for verbatim copying, provided that the
12.\" entire resulting derived work is distributed under the terms of a
13.\" permission notice identical to this one.
14.\"
15.\" Since the Linux kernel and libraries are constantly changing, this
16.\" manual page may be incorrect or out-of-date. The author(s) assume no
17.\" responsibility for errors or omissions, or for damages resulting from
18.\" the use of the information contained herein. The author(s) may not
19.\" have taken the same level of care in the production of this manual,
20.\" which is licensed free of charge, as they might when working
21.\" professionally.
22.\"
23.\" Formatted or processed versions of this manual, if unaccompanied by
24.\" the source, must acknowledge the copyright and authors of this work.
4b72fb64 25.\" %%%LICENSE_END
5f1f495c 26.\"
4b8c67d9 27.TH MATHERR 3 2017-09-15 "Linux" "Linux Programmer's Manual"
5f1f495c
MK
28.SH NAME
29matherr \- SVID math library exception handling
30.SH SYNOPSIS
31.nf
5f1f495c 32.B #include <math.h>
f90f031e 33.PP
5f1f495c 34.BI "int matherr(struct exception *" exc );
f90f031e 35.PP
5f1f495c
MK
36.B extern _LIB_VERSION_TYPE _LIB_VERSION;
37.fi
68e4db0a 38.PP
5f1f495c
MK
39Link with \fI\-lm\fP.
40.SH DESCRIPTION
73593f0d
MK
41.IR Note :
42the mechanism described in this page is no longer supported by glibc.
43Before glibc 2.27, it had been marked as obsolete.
44Since glibc 2.27,
45.\" glibc commit 813378e9fe17e029caf627cab76fe23eb46815fa
46the mechanism has been removed altogether.
47New applications should use the techniques described in
48.BR math_error (7)
49and
50.BR fenv (3).
51This page documents the
52.BR matherr ()
53mechanism as an aid for maintaining and porting older applications.
54.PP
5f1f495c
MK
55The System V Interface Definition (SVID) specifies that various
56math functions should invoke a function called
57.BR matherr ()
58if a math exception is detected.
59This function is called before the math function returns;
60after
61.BR matherr ()
62returns, the system then returns to the math function,
63which in turn returns to the caller.
847e0d88 64.PP
5f1f495c
MK
65To employ
66.BR matherr (),
67the programmer must define the
68.B _SVID_SOURCE
e417acb0
MK
69feature test macro
70(before including
71.I any
72header files),
73and assign the value
5f1f495c
MK
74.B _SVID_
75to the external variable
76.BR _LIB_VERSION .
847e0d88 77.PP
5f1f495c
MK
78The system provides a default version of
79.BR matherr ().
80This version does nothing, and returns zero
81(see below for the significance of this).
82The default
83.BR matherr ()
84can be overridden by a programmer-defined
85version, which will be invoked when an exception occurs.
86The function is invoked with one argument, a pointer to an
87.I exception
88structure, defined as follows:
847e0d88 89.PP
5f1f495c 90.in +4n
b8302363 91.EX
5f1f495c
MK
92struct exception {
93 int type; /* Exception type */
94 char *name; /* Name of function causing exception */
95 double arg1; /* 1st argument to function */
96 double arg2; /* 2nd argument to function */
97 double retval; /* Function return value */
98}
b8302363 99.EE
5f1f495c
MK
100.in
101.PP
102The
103.I type
104field has one of the following values:
105.TP 12
106.B DOMAIN
107A domain error occurred (the function argument was outside the range
108for which the function is defined).
109The return value depends on the function;
110.I errno
111is set to
112.BR EDOM .
113.TP
114.B SING
115A pole error occurred (the function result is an infinity).
116The return value in most cases is
117.B HUGE
118(the largest single precision floating-point number),
119appropriately signed.
120In most cases,
121.I errno
122is set to
123.BR EDOM .
124.TP
125.B OVERFLOW
126An overflow occurred.
127In most cases, the value
128.B HUGE
129is returned, and
130.I errno
131is set to
132.BR ERANGE .
133.TP
134.B UNDERFLOW
135An underflow occurred.
1360.0 is returned, and
137.I errno
138is set to
139.BR ERANGE .
140.TP
141.B TLOSS
142Total loss of significance.
1430.0 is returned, and
144.I errno
145is set to
146.BR ERANGE .
147.TP
148.B PLOSS
149Partial loss of significance.
150This value is unused on glibc
151(and many other systems).
152.PP
153The
154.I arg1
155and
156.I arg2
157fields are the arguments supplied to the function
158.RI ( arg2
159is undefined for functions that take only one argument).
847e0d88 160.PP
5f1f495c
MK
161The
162.I retval
163field specifies the return value that the math
164function will return to its caller.
165The programmer-defined
166.BR matherr ()
167can modify this field to change the return value of the math function.
847e0d88 168.PP
5f1f495c
MK
169If the
170.BR matherr ()
171function returns zero, then the system sets
172.I errno
173as described above, and may print an error message on standard error
174(see below).
847e0d88 175.PP
5f1f495c
MK
176If the
177.BR matherr ()
c7094399 178function returns a nonzero value, then the system does not set
5f1f495c
MK
179.IR errno ,
180and doesn't print an error message.
181.SS Math functions that employ matherr()
182The table below lists the functions and circumstances in which
183.BR matherr ()
184is called.
185The "Type" column indicates the value assigned to
186.I exc\->type
187when calling
188.BR matherr ().
189The "Result" column is the default return value assigned to
190.IR exc\->retval .
847e0d88 191.PP
5f1f495c
MK
192The "Msg?" and "errno" columns describe the default behavior if
193.BR matherr ()
194returns zero.
195If the "Msg?" columns contains "y",
196then the system prints an error message on standard error.
847e0d88 197.PP
5f1f495c 198The table uses the following notations and abbreviations:
207050fa 199.PP
5f1f495c
MK
200.RS
201.nf
5f1f495c
MK
202x first argument to function
203y second argument to function
204fin finite value for argument
205neg negative value for argument
206int integral value for argument
207o/f result overflowed
208u/f result underflowed
209|x| absolute value of x
210X_TLOSS is a constant defined in \fI<math.h>\fP
211.fi
212.RE
213.\" Details below from glibc 2.8's sysdeps/ieee754/k_standard.c
214.\" A subset of cases were test by experimental programs.
215.TS
216lB lB lB cB lB
217l l l c l.
218Function Type Result Msg? errno
219acos(|x|>1) DOMAIN HUGE y EDOM
220asin(|x|>1) DOMAIN HUGE y EDOM
221atan2(0,0) DOMAIN HUGE y EDOM
27844710
MK
222acosh(x<1) DOMAIN NAN y EDOM \" retval is 0.0/0.0
223atanh(|x|>1) DOMAIN NAN y EDOM \" retval is 0.0/0.0
224atanh(|x|==1) SING (x>0.0)? y EDOM \" retval is x/0.0
5f1f495c
MK
225\ \ HUGE_VAL :
226\ \ \-HUGE_VAL
227cosh(fin) o/f OVERFLOW HUGE n ERANGE
228sinh(fin) o/f OVERFLOW (x>0.0) ? n ERANGE
229\ \ HUGE : \-HUGE
230sqrt(x<0) DOMAIN 0.0 y EDOM
231hypot(fin,fin) o/f OVERFLOW HUGE n ERANGE
232exp(fin) o/f OVERFLOW HUGE n ERANGE
233exp(fin) u/f UNDERFLOW 0.0 n ERANGE
234exp2(fin) o/f OVERFLOW HUGE n ERANGE
235exp2(fin) u/f UNDERFLOW 0.0 n ERANGE
236exp10(fin) o/f OVERFLOW HUGE n ERANGE
237exp10(fin) u/f UNDERFLOW 0.0 n ERANGE
238j0(|x|>X_TLOSS) TLOSS 0.0 y ERANGE
239j1(|x|>X_TLOSS) TLOSS 0.0 y ERANGE
240jn(|x|>X_TLOSS) TLOSS 0.0 y ERANGE
241y0(x>X_TLOSS) TLOSS 0.0 y ERANGE
242y1(x>X_TLOSS) TLOSS 0.0 y ERANGE
243yn(x>X_TLOSS) TLOSS 0.0 y ERANGE
244y0(0) DOMAIN \-HUGE y EDOM
245y0(x<0) DOMAIN \-HUGE y EDOM
246y1(0) DOMAIN \-HUGE y EDOM
247y1(x<0) DOMAIN \-HUGE y EDOM
248yn(n,0) DOMAIN \-HUGE y EDOM
249yn(x<0) DOMAIN \-HUGE y EDOM
250lgamma(fin) o/f OVERFLOW HUGE n ERANGE
251lgamma(\-int) or SING HUGE y EDOM
252\ \ lgamma(0)
253tgamma(fin) o/f OVERFLOW HUGE_VAL n ERANGE
254tgamma(\-int) SING NAN y EDOM
255tgamma(0) SING copysign( y ERANGE
256\ \ HUGE_VAL,x)
257log(0) SING \-HUGE y EDOM
258log(x<0) DOMAIN \-HUGE y EDOM
259log2(0) SING \-HUGE n EDOM \" different from log()
c3074d70 260log2(x<0) DOMAIN \-HUGE n EDOM \" different from log()
5f1f495c
MK
261log10(0) SING \-HUGE y EDOM
262log10(x<0) DOMAIN \-HUGE y EDOM
263pow(0.0,0.0) DOMAIN 0.0 y EDOM
264pow(x,y) o/f OVERFLOW HUGE n ERANGE
265pow(x,y) u/f UNDERFLOW 0.0 n ERANGE
266pow(NaN,0.0) DOMAIN x n EDOM
2670**neg DOMAIN 0.0 y EDOM \" +0 and -0
268neg**non-int DOMAIN 0.0 y EDOM
269scalb() o/f OVERFLOW (x>0.0) ? n ERANGE
270\ \ HUGE_VAL :
271\ \ \-HUGE_VAL
272scalb() u/f UNDERFLOW copysign( n ERANGE
273\ \ \ \ 0.0,x)
274fmod(x,0) DOMAIN x y EDOM
27844710 275remainder(x,0) DOMAIN NAN y EDOM \" retval is 0.0/0.0
5f1f495c 276.TE
d79dfbf6 277.SH ATTRIBUTES
3c461ccc
PH
278For an explanation of the terms used in this section, see
279.BR attributes (7).
280.TS
281allbox;
282lb lb lb
283l l l.
284Interface Attribute Value
285T{
d79dfbf6 286.BR matherr ()
3c461ccc
PH
287T} Thread safety MT-Safe
288.TE
5f1f495c
MK
289.SH EXAMPLE
290The example program demonstrates the use of
291.BR matherr ()
292when calling
293.BR log (3).
294The program takes up to three command-line arguments.
295The first argument is the floating-point number to be given to
296.BR log (3).
297If the optional second argument is provided, then
298.B _LIB_VERSION
299is set to
300.B _SVID_
301so that
302.BR matherr ()
303is called, and the integer supplied in the
304command-line argument is used as the return value from
305.BR matherr ().
306If the optional third command-line argument is supplied,
307then it specifies an alternative return value that
308.BR matherr ()
309should assign as the return value of the math function.
847e0d88 310.PP
5f1f495c
MK
311The following example run, where
312.BR log (3)
313is given an argument of 0.0, does not use
b18e759d 314.BR matherr ():
847e0d88 315.PP
5f1f495c 316.in +4n
b8302363 317.EX
b43a3b30 318.RB "$" " ./a.out 0.0"
5f1f495c
MK
319errno: Numerical result out of range
320x=-inf
b8302363 321.EE
5f1f495c 322.in
847e0d88 323.PP
5f1f495c
MK
324In the following run,
325.BR matherr ()
326is called, and returns 0:
847e0d88 327.PP
5f1f495c 328.in +4n
b8302363 329.EX
b43a3b30 330.RB "$" " ./a.out 0.0 0"
5f1f495c
MK
331matherr SING exception in log() function
332 args: 0.000000, 0.000000
c3074d70 333 retval: \-340282346638528859811704183484516925440.000000
5f1f495c
MK
334log: SING error
335errno: Numerical argument out of domain
336x=-340282346638528859811704183484516925440.000000
b8302363 337.EE
5f1f495c 338.in
847e0d88 339.PP
5f1f495c 340The message "log: SING error" was printed by the C library.
847e0d88 341.PP
5f1f495c
MK
342In the following run,
343.BR matherr ()
c7094399 344is called, and returns a nonzero value:
847e0d88 345.PP
5f1f495c 346.in +4n
b8302363 347.EX
b43a3b30 348.RB "$" " ./a.out 0.0 1"
5f1f495c
MK
349matherr SING exception in log() function
350 args: 0.000000, 0.000000
c3074d70 351 retval: \-340282346638528859811704183484516925440.000000
5f1f495c 352x=-340282346638528859811704183484516925440.000000
b8302363 353.EE
5f1f495c 354.in
847e0d88 355.PP
5f1f495c
MK
356In this case, the C library did not print a message, and
357.I errno
358was not set.
847e0d88 359.PP
5f1f495c
MK
360In the following run,
361.BR matherr ()
362is called, changes the return value of the math function,
c7094399 363and returns a nonzero value:
847e0d88 364.PP
5f1f495c 365.in +4n
b8302363 366.EX
b43a3b30 367.RB "$" " ./a.out 0.0 1 12345.0"
5f1f495c
MK
368matherr SING exception in log() function
369 args: 0.000000, 0.000000
c3074d70 370 retval: \-340282346638528859811704183484516925440.000000
5f1f495c 371x=12345.000000
b8302363 372.EE
5f1f495c 373.in
9c330504 374.SS Program source
d84d0300 375\&
e7d0bb47 376.EX
5f1f495c
MK
377#define _SVID_SOURCE
378#include <errno.h>
379#include <math.h>
380#include <stdio.h>
381#include <stdlib.h>
382
383static int matherr_ret = 0; /* Value that matherr()
384 should return */
385static int change_retval = 0; /* Should matherr() change
386 function\(aqs return value? */
387static double new_retval; /* New function return value */
388
389int
390matherr(struct exception *exc)
391{
392 fprintf(stderr, "matherr %s exception in %s() function\\n",
393 (exc\->type == DOMAIN) ? "DOMAIN" :
394 (exc\->type == OVERFLOW) ? "OVERFLOW" :
395 (exc\->type == UNDERFLOW) ? "UNDERFLOW" :
396 (exc\->type == SING) ? "SING" :
397 (exc\->type == TLOSS) ? "TLOSS" :
398 (exc\->type == PLOSS) ? "PLOSS" : "???",
399 exc\->name);
400 fprintf(stderr, " args: %f, %f\\n",
72da9ef1 401 exc\->arg1, exc\->arg2);
5f1f495c
MK
402 fprintf(stderr, " retval: %f\\n", exc\->retval);
403
404 if (change_retval)
405 exc\->retval = new_retval;
406
407 return matherr_ret;
408}
409
410int
411main(int argc, char *argv[])
412{
413 double x;
414
415 if (argc < 2) {
416 fprintf(stderr, "Usage: %s <argval>"
72da9ef1 417 " [<matherr\-ret> [<new\-func\-retval>]]\\n", argv[0]);
5f1f495c
MK
418 exit(EXIT_FAILURE);
419 }
420
421 if (argc > 2) {
422 _LIB_VERSION = _SVID_;
423 matherr_ret = atoi(argv[2]);
424 }
425
426 if (argc > 3) {
427 change_retval = 1;
428 new_retval = atof(argv[3]);
429 }
430
431 x = log(atof(argv[1]));
432 if (errno != 0)
433 perror("errno");
434
435 printf("x=%f\\n", x);
436 exit(EXIT_SUCCESS);
437}
e7d0bb47 438.EE
5f1f495c 439.SH SEE ALSO
5f1f495c
MK
440.BR fenv (3),
441.BR math_error (7),
442.BR standards (7)