Namensräume
Varianten
Aktionen

MATH_ERRNO, MATH_ERREXCEPT, math_errhandling

Von cppreference.com
< c‎ | numerik‎ | math
 
 
 
Allgemeine mathematische Funktionen
Funktionen
Grundlegende Operationen
(C99)
(C99)
(C99)
(C99)(C99)(C99)(C23)
Maximum/Minimum-Operationen
(C99)
(C99)
Exponentialfunktionen
(C23)
(C99)
(C99)
(C23)
(C23)

(C99)
(C99)(C23)
(C23)
(C23)
Potenzfunktionen
(C99)
(C23)
(C23)

(C99)
(C23)
(C23)
Trigonometrische und hyperbolische Funktionen
(C23)
(C23)
(C23)
(C23)
(C99)
(C99)
(C99)
Nächste ganze Gleitkommazahlen
(C99)(C99)(C99)
(C99)

(C99)(C99)(C99)
(C23)(C23)(C23)(C23)
Gleitkomma-Manipulation
(C99)(C99)
(C99)(C23)
(C99)
Verengende Operationen
(C23)
(C23)
(C23)
(C23)
(C23)
(C23)
Quanten- und Quantenexponent-Funktionen
Dezimal-Neu-Kodierungsfunktionen
Gesamtordnung und Payload-Funktionen
Klassifizierung
(C99)
(C99)
(C99)
(C23)
Fehler- und Gammafunktionen
(C99)
(C99)
(C99)
(C99)
Typen
Makrokonstanten
Spezielle Gleitkommawerte
(C99)(C23)
Argumente und Rückgabewerte
Fehlerbehandlung
MATH_ERRNOMATH_ERRNOEXCEPT
(C99)(C99) 
math_errhandling
(C99)

Schnelle Operationsanzeigen
 
Definiert in Header <math.h>
#define MATH_ERRNO        1
(seit C99)
#define MATH_ERREXCEPT    2
(seit C99)
#define math_errhandling  /*implementation defined*/
(seit C99)

Der Makrokonstante math_errhandling expandiert zu einem Ausdruck vom Typ int, der entweder gleich MATH_ERRNO, oder gleich MATH_ERREXCEPT, oder gleich deren bitweisem ODER (MATH_ERRNO | MATH_ERREXCEPT) ist.

Der Wert von math_errhandling gibt die Art der Fehlerbehandlung an, die von den Gleitkommaoperatoren und -funktionen durchgeführt wird.

Konstante Erklärung
MATH_ERREXCEPT gibt an, dass Gleitkomma-Exceptions verwendet werden: mindestens FE_DIVBYZERO, FE_INVALID und FE_OVERFLOW sind in <fenv.h> definiert.
MATH_ERRNO gibt an, dass Gleitkommaoperationen die Variable errno zur Fehlerberichterstattung verwenden.

Wenn die Implementierung IEEE-Gleitkommaarithmetik (IEC 60559) unterstützt, muss math_errhandling & MATH_ERREXCEPT ungleich Null sein.

Die folgenden Gleitkommafehlerbedingungen werden erkannt

Bedingung Erklärung errno Gleitkomma-Exception Beispiel
Domänenfehler das Argument liegt außerhalb des Bereichs, in dem die Operation mathematisch definiert ist (die Beschreibung jeder Funktion listet die erforderlichen Domänenfehler auf) EDOM FE_INVALID acos(2)
Polfehler das mathematische Ergebnis der Funktion ist exakt unendlich oder undefiniert ERANGE FE_DIVBYZERO log(0.0), 1.0/0.0
Bereichsfehler aufgrund von Überlauf das mathematische Ergebnis ist endlich, wird aber nach dem Runden unendlich oder nach dem Abrunden zum größten darstellbaren endlichen Wert ERANGE FE_OVERFLOW pow(DBL_MAX,2)
Bereichsfehler aufgrund von Unterlauf das Ergebnis ist ungleich Null, wird aber nach dem Runden Null oder wird subnormal mit einem Präzisionsverlust ERANGE oder unverändert (implementierungsabhängig) FE_UNDERFLOW oder nichts (implementierungsabhängig) DBL_TRUE_MIN/2
Ungenaues Ergebnis das Ergebnis muss gerundet werden, um in den Zieltyp zu passen unverändert FE_INEXACT oder nichts (nicht spezifiziert) sqrt(2), 1.0/10.0

Inhalt

[bearbeiten] Hinweise

Ob FE_INEXACT durch die mathematischen Bibliotheksfunktionen ausgelöst wird, ist im Allgemeinen nicht spezifiziert, kann aber in der Beschreibung der Funktion explizit angegeben werden (z.B. rint vs nearbyint).

Vor C99 waren Gleitkomma-Exceptions nicht spezifiziert, EDOM war für jeden Domänenfehler erforderlich, ERANGE war für Überläufe und implementierungsabhängig für Unterläufe erforderlich.

[bearbeiten] Beispiel

#include <stdio.h>
#include <fenv.h>
#include <math.h>
#include <errno.h>
#pragma STDC FENV_ACCESS ON
int main(void)
{
    printf("MATH_ERRNO is %s\n", math_errhandling & MATH_ERRNO ? "set" : "not set");
    printf("MATH_ERREXCEPT is %s\n",
           math_errhandling & MATH_ERREXCEPT ? "set" : "not set");
    feclearexcept(FE_ALL_EXCEPT);
    errno = 0;
    printf("log(0) = %f\n", log(0));
    if(errno == ERANGE)
        perror("errno == ERANGE");
    if(fetestexcept(FE_DIVBYZERO))
        puts("FE_DIVBYZERO (pole error) reported");
}

Mögliche Ausgabe

MATH_ERRNO is set
MATH_ERREXCEPT is set
log(0) = -inf
errno = ERANGE: Numerical result out of range
FE_DIVBYZERO (pole error) reported

[bearbeiten] Referenzen

  • C17-Standard (ISO/IEC 9899:2018)
  • 7.12/9 MATH_ERRNO, MATH_ERREXCEPT, math_errhandling (S. 170)
  • F.10/4 MATH_ERREXCEPT, math_errhandling (S. 377)
  • C11-Standard (ISO/IEC 9899:2011)
  • 7.12/9 MATH_ERRNO, MATH_ERREXCEPT, math_errhandling (S. 233)
  • F.10/4 MATH_ERREXCEPT, math_errhandling (S. 517)
  • C99-Standard (ISO/IEC 9899:1999)
  • 7.12/9 MATH_ERRNO, MATH_ERREXCEPT, math_errhandling (S. 214)
  • F.9/4 MATH_ERREXCEPT, math_errhandling> (S. 454)

[bearbeiten] Siehe auch

Gleitkomma-Ausnahmen
(macro constant) [edit]
Makro, das zur POSIX-kompatiblen, Thread-lokalen Fehlernummern-Variable expandiert
(Makrovariable) [bearbeiten]
C++ Dokumentation für math_errhandling