73 lines
2.0 KiB
C++
73 lines
2.0 KiB
C++
|
/* matherr
|
|||
|
|
|||
|
Turbo-C Run Time Library
|
|||
|
|
|||
|
Copyright (c) 1987 by Borland International. All rights reserved.
|
|||
|
*/
|
|||
|
|
|||
|
#include <stdio.h>
|
|||
|
#include <math.h>
|
|||
|
#include <errno.h>
|
|||
|
|
|||
|
|
|||
|
/*
|
|||
|
When exceptions are detected in the maths library then a call is
|
|||
|
made to _matherr() with all the available information.
|
|||
|
|
|||
|
That function does very little, except to map the exception "why"
|
|||
|
into either ERANGE or EDOMAIN in errno. Its main purpose is to
|
|||
|
act as a focal point for changes in error handling.
|
|||
|
|
|||
|
For example, if you were writing a spreadsheet you might replace
|
|||
|
this function with one which pops up an error window explaining
|
|||
|
something like:
|
|||
|
|
|||
|
"log (-2.0) caused domain error, in cell J7"
|
|||
|
|
|||
|
and then longjmp() to a reset state in the spreadsheet and await
|
|||
|
the next command from the user.
|
|||
|
|
|||
|
The important thing is that we don't know what error handling
|
|||
|
you want, but you are assured that all errors will arrive at
|
|||
|
matherr() with all the information you need to design a custom
|
|||
|
format.
|
|||
|
|
|||
|
We do not ship as standard the function named matherr() which may
|
|||
|
be familiar to UNIX users, since the ANSI x3j11 draft specifies
|
|||
|
an incompatible style. This version is as close as we could
|
|||
|
get without breaking the ANSI rules. You can, however, convert
|
|||
|
this version to the UNIX style if you prefer. The necessary
|
|||
|
code is included but switched off.
|
|||
|
*/
|
|||
|
|
|||
|
|
|||
|
#ifdef UNIX_matherr
|
|||
|
char *whyS [] =
|
|||
|
{
|
|||
|
"argument domain error",
|
|||
|
"argument singularity ",
|
|||
|
"overflow range error ",
|
|||
|
"underflow range error",
|
|||
|
"total loss of significance",
|
|||
|
"partial loss of significance"
|
|||
|
};
|
|||
|
|
|||
|
int matherr (struct exception *e)
|
|||
|
/*
|
|||
|
The default version of matherr() traditionally explains what has
|
|||
|
gone wrong and then kills the program.
|
|||
|
*/
|
|||
|
{
|
|||
|
fprintf (stderr,
|
|||
|
"%s (%8g,%8g): %s\n", e->name, e->arg1, e->arg2, whyS [e->type - 1]);
|
|||
|
|
|||
|
exit (1);
|
|||
|
}
|
|||
|
#else
|
|||
|
|
|||
|
int matherr (struct exception *e)
|
|||
|
{
|
|||
|
return (0);
|
|||
|
}
|
|||
|
#endif
|
|||
|
|