aboutsummaryrefslogtreecommitdiff
path: root/newlib/libm/common/s_matherr.c
diff options
context:
space:
mode:
Diffstat (limited to 'newlib/libm/common/s_matherr.c')
-rw-r--r--newlib/libm/common/s_matherr.c123
1 files changed, 123 insertions, 0 deletions
diff --git a/newlib/libm/common/s_matherr.c b/newlib/libm/common/s_matherr.c
new file mode 100644
index 0000000..58e2428
--- /dev/null
+++ b/newlib/libm/common/s_matherr.c
@@ -0,0 +1,123 @@
+
+/* @(#)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
+
+ANSI_SYNOPSIS
+ #include <math.h>
+ int matherr(struct exception *<[e]>);
+
+TRAD_SYNOPSIS
+ #include <math.h>
+ int matherr(*<[e]>)
+ 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;
+}