aboutsummaryrefslogtreecommitdiff
path: root/newlib/libm/common/s_matherr.c
blob: 00d2caa389b948f252e63fed024abe5a14c0aeb3 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118

/* @(#)s_matherr.c 5.1 93/09/24 */
/*
 * ====================================================
 * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
 *
 * Developed at SunPro, a Sun Microsystems, Inc. business.
 * Permission to use, copy, modify, and distribute this
 * software is freely granted, provided that this notice 
 * is preserved.
 * ====================================================
 */

/*

FUNCTION
	<<matherr>>---modifiable math error handler

INDEX 
	matherr

SYNOPSIS
	#include <math.h>
	int matherr(struct exception *<[e]>);

DESCRIPTION
<<matherr>> is called whenever a math library function generates an error.
You can replace <<matherr>> by your own subroutine to customize
error treatment.  The customized <<matherr>> must return 0 if
it fails to resolve the error, and non-zero if the error is resolved.

When <<matherr>> returns a nonzero value, no error message is printed
and the value of <<errno>> is not modified.  You can accomplish either
or both of these things in your own <<matherr>> using the information
passed in the structure <<*<[e]>>>.

This is the <<exception>> structure (defined in `<<math.h>>'):
.	struct exception {
.	        int type;
.	        char *name;
.	        double arg1, arg2, retval;
.		int err;
.	};

The members of the exception structure have the following meanings:
o+
o type
The type of mathematical error that occured; macros encoding error
types are also defined in `<<math.h>>'.

o name
a pointer to a null-terminated string holding the
name of the math library function where the error occurred.

o arg1, arg2
The arguments which caused the error.

o retval
The error return value (what the calling function will return).

o err
If set to be non-zero, this is the new value assigned to <<errno>>.
o-

The error types defined in `<<math.h>>' represent possible mathematical
errors as follows:

o+
o DOMAIN
An argument was not in the domain of the function; e.g. <<log(-1.0)>>.

o SING
The requested calculation would result in a singularity; e.g. <<pow(0.0,-2.0)>>

o OVERFLOW
A calculation would produce a result too large to represent; e.g.
<<exp(1000.0)>>. 

o UNDERFLOW
A calculation would produce a result too small to represent; e.g.
<<exp(-1000.0)>>. 

o TLOSS
Total loss of precision.  The result would have no significant digits;
e.g. <<sin(10e70)>>. 

o PLOSS
Partial loss of precision.
o-


RETURNS
The library definition for <<matherr>> returns <<0>> in all cases.

You can change the calling function's result from a customized <<matherr>>
by modifying <<e->retval>>, which propagates backs to the caller.

If <<matherr>> returns <<0>> (indicating that it was not able to resolve
the error) the caller sets <<errno>> to an appropriate value, and prints
an error message.

PORTABILITY
<<matherr>> is not ANSI C.  
*/

#include "fdlibm.h"

#ifdef __STDC__
	int matherr(struct exception *x)
#else
	int matherr(x)
	struct exception *x;
#endif
{
	int n=0;
	if(x->arg1!=x->arg1) return 0;
	return n;
}