/* errno_or_flag.c -- how does a math function report a domain error here?
   math_errhandling says: MATH_ERRNO means errno is set, MATH_ERREXCEPT means
   a floating-point flag is raised. C17 7.12 lets a library do either or both.
   Build: cc -std=c17 -Wall -Wextra -pedantic errno_or_flag.c -lm -o errno_or_flag */
#include <errno.h>
#include <fenv.h>
#include <math.h>
#include <stdio.h>

int main(void)
{
    printf("math_errhandling & MATH_ERRNO     -> %d\n", (math_errhandling & MATH_ERRNO) != 0);
    printf("math_errhandling & MATH_ERREXCEPT -> %d\n", (math_errhandling & MATH_ERREXCEPT) != 0);

    volatile double minus_42 = -42.0;
    errno = 0;
    feclearexcept(FE_ALL_EXCEPT);
    double r = sqrt(minus_42);
    int invalid = fetestexcept(FE_INVALID) != 0;
    int edom = errno == EDOM;
    printf("sqrt(-42.0): isnan %d, FE_INVALID %d, errno == EDOM %d\n",
           isnan(r) != 0, invalid, edom);
    return 0;
}
