matherr(3M) matherr(3M)
NAME
matherr - Fehlerbehandlungsfunktion
SYNTAX
cc [option ...] datei ... -lm [bibliothek ...]
#include <math.h>
int matherr(struct exception *x);
BESCHREIBUNG
matherr() wird von Funktionen der mathematischen Bibliothek zur
Festellung von Fehlern aufgerufen. Beachten Sie, daß matherr() nicht
aufgerufen wird, wenn die Übersetzeroption -kansi verwendet wird. Die
Benutzer können eigene Prozeduren zur Behandlung von Fehlern definie-
ren, indem sie eine Funktion mit dem Namen matherr() in den jeweiligen
Programme vorsehen. matherr() muß die obenstehende Form aufweisen. Bei
Auftreten eines Fehlers wird ein Zeiger auf die Struktur x zur
Beschreibung der Ausnahmesituation an die vom Benutzer bereitgestellte
Funktion matherr() weitergereicht. Diese Struktur, die in der
Include-Datei math.h definiert ist, hat folgende Form:
struct exception {
int type;
char *name;
double arg1, arg2, retval;
};
Das Element type ist eine Zahl vom Typ int, die den Typ des aufgetre-
tenen Fehlers anhand der nachstehenden Liste (in der Include-Datei
definiert) von Konstanten beschreibt:
DOMAIN Argument außerhalb des Definitionsbereichs
SING Singularität des Arguments
OVERFLOW Überlauf des Ergebnisses
UNDERFLOW Unterlauf des Ergebnisses
TLOSS totaler Verlust der Genauigkeit
PLOSS teilweiser Verlust der Genauigkeit
Das Element name weist auf eine Zeichenkette mit dem Namen der Funk-
tion, in der der Fehler aufgetreten ist. Die Variablen arg1 und arg2
sind die Argumente, mit denen die Funktion aufgerufen wurde. retval
wird auf den Standardwert gesetzt, der von der Funktion zurückgegeben
wird, wenn es nicht von der Funktion matherr() auf einen anderen Wert
gesetzt wird.
Seite 1 Reliant UNIX 5.44 Gedruckt 11/98
matherr(3M) matherr(3M)
Wenn die Funktion matherr() einen Wert ungleich null zurückgibt, wer-
den keine Fehlermeldungen ausgegeben, und errno wird nicht gesetzt.
Wenn matherr() nicht vom Benutzer bereitgestellt wird, dann werden bei
Auftreten eines Fehlers die bei den betroffenen mathematischen Funk-
tionen beschriebenen Standard-Fehlerbehandlungs-Prozeduren aufgerufen.
Diese Prozeduren sind in der nachstehenden Tabelle zusammengefaßt. In
jedem Fall wird errno auf EDOM oder ERANGE gesetzt, und das Programm
läuft weiter.
__________________________________________________________________________
| Standardprozeduren für Fehlerbehandlung |
|_____________________|__________________________________________________|
| | Fehlertypen |
|_____________________|_______|_____|_________|__________|_______|_______|
| type | DOMAIN| SING| OVERFLOW| UNDERFLOW| TLOSS | PLOSS |
|_____________________|_______|_____|_________|__________|_______|_______|
| errno | EDOM | EDOM| ERANGE | ERANGE | ERANGE| ERANGE|
|_____________________|_______|_____|_________|__________|_______|_______|
|BESSEL: | - | - | - | - | M, 0 | - |
|y0, y1, yn (arg <= 0)| M, -H | - | - | - | - | - |
|_____________________|_______|_____|_________|__________|_______|_______|
|EXP, EXPF: | - | - | H | 0 | - | - |
|_____________________|_______|_____|_________|__________|_______|_______|
|LOG, LOG10: | | | | | | |
|LOGF, LOG10F: | | | | | | |
|(arg < 0) | M, -H | - | - | - | - | |
|(arg = 0) | M, -H | - | - | - | - | - |
|_____________________|_______|_____|_________|__________|_______|_______|
|POW, POWF: | - | - | +H | 0 | - | - |
|neg ** nicht-int | M, 0 | - | - | - | - | - |
| 0 ** nicht-pos | M, 0 | - | - | - | - | - |
|_____________________|_______|_____|_________|__________|_______|_______|
|SQRT, SQRTF: | M, 0 | - | - | - | - | - |
|_____________________|_______|_____|_________|__________|_______|_______|
|FMOD, FMODF: | | | | | | |
|(arg2 = 0) | M, X | - | - | - | - | - |
|_____________________|_______|_____|_________|__________|_______|_______|
|REMAINDER: | | | | | | |
|(arg2 = 0) | M, N | - | - | - | - | - |
|_____________________|_______|_____|_________|__________|_______|_______|
|GAMMA, LGAMMA: | - | M, H| H | - | - | - |
|_____________________|_______|_____|_________|__________|_______|_______|
|HYPOT: | - | - | H | - | - | - |
|_____________________|_______|_____|_________|__________|_______|_______|
|SINH, SINHF: | - | - | +H | - | - | - |
|_____________________|_______|_____|_________|__________|_______|_______|
|COSH, COSHF: | - | - | H | - | - | - |
|_____________________|_______|_____|_________|__________|_______|_______|
Seite 2 Reliant UNIX 5.44 Gedruckt 11/98
matherr(3M) matherr(3M)
__________________________________________________________________________
| Standardprozeduren für Fehlerbehandlung |
|_____________________|__________________________________________________|
| | Fehlertypen |
|_____________________|_______|_____|_________|__________|_______|_______|
| type | DOMAIN| SING| OVERFLOW| UNDERFLOW| TLOSS | PLOSS |
|_____________________|_______|_____|_________|__________|_______|_______|
| errno | EDOM | EDOM| ERANGE | ERANGE | ERANGE| ERANGE|
|_____________________|_______|_____|_________|__________|_______|_______|
|ASIN, ACOS, ATAN2: | | | | | | |
|ASINF, ACOSF, ATAN2F:| M, 0 | - | - | - | - | - |
|_____________________|_______|_____|_________|__________|_______|_______|
|ACOSH: | M, N | - | - | - | - | - |
|_____________________|_______|_____|_________|__________|_______|_______|
|ATANH: | | | | | | |
|(|arg| > 1) | M, N | - | - | - | - | - |
|(|arg| = 1) | - | M, N| - | - | - | - |
|_____________________|_______|_____|_________|__________|_______|_______|
Abkürzungen
M Meldung wird ausgegeben (nicht im ANSI-Modus).
H HUGE wird zurückgegeben (HUGEVAL im ANSI-Modus).
-H -HUGE wird zurückgegeben (-HUGEVAL im ANSI-Modus).
+H HUGE oder -HUGE wird zurückgegeben (HUGEVAL oder -HUGEVAL im
ANSI-Modus).
0 0 wird zurückgegeben.
X arg1 wird zurückgegeben.
N NaN wird zurückgegeben.
Seite 3 Reliant UNIX 5.44 Gedruckt 11/98
matherr(3M) matherr(3M)
BEISPIELE
#include <math.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int
matherr(register struct exception *x);
{
switch (x->type) {
case DOMAIN:
/* sqrt verändern, so daß sqrt(-arg1) zurückgegeben wird,*/
/* nicht 0 */
if (!strcmp(x->name, "sqrt")) {
x->retval = sqrt(-x->arg1);
return (0); /* Meldung ausgeben und errno setzen */
}
case SING:
/* Bei allen anderen DOMAIN- oder SING-Fehlern, Meldung */
/* ausgeben und abbrechen (abort) */
fprintf(stderr, "Gültigkeitsbereichsfehler in %s\n",
x->name);
abort( );
case PLOSS:
/* detaillierte Fehlermeldung ausgeben */
fprintf(stderr, "Genauigkeitsverlsut in %s(%g)=%g\n"
x->name, x->arg1, x->retval);
return (1); /* keine weiteren Maßnahmen ergreifen */
}
return (0); /* bei allen anderen Fehlern die
Standardprozedur ausführen */
}
SIEHE AUCH
math(5).
Seite 4 Reliant UNIX 5.44 Gedruckt 11/98