Namespaces
Variants

MATH_ERRNO, MATH_ERREXCEPT, math_errhandling

From cppreference.net
< c ‎ | numeric ‎ | math
Common mathematical functions
Functions
Basic operations
(C99)
(C99)
(C99)
(C99) (C99) (C99) (C23)
Maximum/minimum operations
Exponential functions
Power functions
Trigonometric and hyperbolic functions
Nearest integer floating-point
(C99) (C99) (C99)
(C23) (C23) (C23) (C23)
Floating-point manipulation
Narrowing operations
(C23)
(C23)
(C23)
(C23)
(C23)
(C23)
Quantum and quantum exponent
Decimal re-encoding functions
Total order and payload functions
Classification
Error and gamma functions
(C99)
(C99)
(C99)
(C99)
Types
Macro constants
Special floating-point values
Arguments and return values
Error handling
MATH_ERRNO MATH_ERRNOEXCEPT
(C99) (C99)
math_errhandling
(C99)

Fast operation indicators
Definiert im Header <math.h>
#define MATH_ERRNO        1
(seit C99)
#define MATH_ERREXCEPT    2
(seit C99)
#define math_errhandling  /*implementierungsdefiniert*/
(seit C99)

Die Makrokonstante math_errhandling expandiert zu einem Ausdruck vom Typ int , der entweder gleich MATH_ERRNO , oder gleich MATH_ERREXCEPT , oder gleich deren bitweisen 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 zeigt an, dass Gleitkomma-Ausnahmen verwendet werden: mindestens FE_DIVBYZERO , FE_INVALID , und FE_OVERFLOW sind in <fenv.h> definiert.
MATH_ERRNO zeigt an, dass Gleitkomma-Operationen die Variable errno zur Fehlerberichterstattung verwenden.

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

Die folgenden Gleitkomma-Fehlerbedingungen werden erkannt:

Bedingung Erklärung errno Gleitkomma-Ausnahme Beispiel
Definitionsbereichsfehler Das Argument liegt außerhalb des Bereichs, in dem die Operation mathematisch definiert ist (die Beschreibung jeder Funktion listet die erforderlichen Definitionsbereichsfehler auf) EDOM FE_INVALID acos ( 2 )
Polstellenfehler Das mathematische Ergebnis der Funktion ist exakt unendlich oder undefiniert ERANGE FE_DIVBYZERO log ( 0.0 ) , 1.0 / 0.0
Wertebereichsfehler durch Überlauf Das mathematische Ergebnis ist endlich, wird aber nach dem Runden unendlich oder wird nach dem Abrunden zum größten darstellbaren endlichen Wert ERANGE FE_OVERFLOW pow ( DBL_MAX , 2 )
Wertebereichsfehler durch Unterlauf Das Ergebnis ist ungleich Null, wird aber nach dem Runden zu Null oder wird subnormal mit Genauigkeitsverlust ERANGE oder unverändert (implementierungsdefiniert) FE_UNDERFLOW oder nichts (implementierungsdefiniert) 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

Inhaltsverzeichnis

Hinweise

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

Vor C99 waren Gleitkomma-Ausnahmen nicht spezifiziert, EDOM war für jeden Domain-Fehler erforderlich, ERANGE war für Überläufe erforderlich und implementierungsdefiniert für Unterläufe.

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

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)

Siehe auch

Gleitkomma-Ausnahmen
(Makrokonstante)
Makro, das zu einer POSIX-kompatiblen thread-lokalen Fehlernummer-Variable expandiert
(Makrovariable)
C++-Dokumentation für math_errhandling