#include <math.h>
|
#include <math.h>
|
#include <fenv.h>
|
#include <fenv.h>
|
|
|
extern void abort(void);
|
extern void abort(void);
|
|
|
#define C99_MATH_TESTS(nan, inf, huge, norm1, norm2, norm3, sub, zero, neg) \
|
#define C99_MATH_TESTS(nan, inf, huge, norm1, norm2, norm3, sub, zero, neg) \
|
{ \
|
{ \
|
if (feclearexcept (FE_ALL_EXCEPT) != 0) \
|
if (feclearexcept (FE_ALL_EXCEPT) != 0) \
|
abort(); \
|
abort(); \
|
\
|
\
|
\
|
\
|
if (fpclassify (nan) != FP_NAN) \
|
if (fpclassify (nan) != FP_NAN) \
|
abort (); \
|
abort (); \
|
\
|
\
|
if (fpclassify (inf) != FP_INFINITE) \
|
if (fpclassify (inf) != FP_INFINITE) \
|
abort (); \
|
abort (); \
|
\
|
\
|
if (fpclassify (huge) != FP_INFINITE) \
|
if (fpclassify (huge) != FP_INFINITE) \
|
abort (); \
|
abort (); \
|
\
|
\
|
if (fpclassify (norm1) != FP_NORMAL) \
|
if (fpclassify (norm1) != FP_NORMAL) \
|
abort (); \
|
abort (); \
|
\
|
\
|
if (fpclassify (norm2) != FP_NORMAL) \
|
if (fpclassify (norm2) != FP_NORMAL) \
|
abort (); \
|
abort (); \
|
\
|
\
|
if (fpclassify (norm3) != FP_NORMAL) \
|
if (fpclassify (norm3) != FP_NORMAL) \
|
abort (); \
|
abort (); \
|
\
|
\
|
if (fpclassify (sub) != FP_SUBNORMAL) \
|
if (fpclassify (sub) != FP_SUBNORMAL) \
|
abort (); \
|
abort (); \
|
\
|
\
|
if (fpclassify (zero) != FP_ZERO) \
|
if (fpclassify (zero) != FP_ZERO) \
|
abort (); \
|
abort (); \
|
\
|
\
|
\
|
\
|
if (!isnan (nan)) \
|
if (!isnan (nan)) \
|
abort (); \
|
abort (); \
|
\
|
\
|
if (isnan (inf)) \
|
if (isnan (inf)) \
|
abort (); \
|
abort (); \
|
\
|
\
|
if (isnan (huge)) \
|
if (isnan (huge)) \
|
abort (); \
|
abort (); \
|
\
|
\
|
if (isnan (norm1)) \
|
if (isnan (norm1)) \
|
abort (); \
|
abort (); \
|
\
|
\
|
if (isnan (norm2)) \
|
if (isnan (norm2)) \
|
abort (); \
|
abort (); \
|
\
|
\
|
if (isnan (norm3)) \
|
if (isnan (norm3)) \
|
abort (); \
|
abort (); \
|
\
|
\
|
if (isnan (sub)) \
|
if (isnan (sub)) \
|
abort (); \
|
abort (); \
|
\
|
\
|
if (isnan (zero)) \
|
if (isnan (zero)) \
|
abort (); \
|
abort (); \
|
\
|
\
|
\
|
\
|
if (isinf (nan)) \
|
if (isinf (nan)) \
|
abort (); \
|
abort (); \
|
\
|
\
|
if (!isinf (inf)) \
|
if (!isinf (inf)) \
|
abort (); \
|
abort (); \
|
\
|
\
|
if (!isinf (huge)) \
|
if (!isinf (huge)) \
|
abort (); \
|
abort (); \
|
\
|
\
|
if (isinf (norm1)) \
|
if (isinf (norm1)) \
|
abort (); \
|
abort (); \
|
\
|
\
|
if (isinf (norm2)) \
|
if (isinf (norm2)) \
|
abort (); \
|
abort (); \
|
\
|
\
|
if (isinf (norm3)) \
|
if (isinf (norm3)) \
|
abort (); \
|
abort (); \
|
\
|
\
|
if (isinf (sub)) \
|
if (isinf (sub)) \
|
abort (); \
|
abort (); \
|
\
|
\
|
if (isinf (zero)) \
|
if (isinf (zero)) \
|
abort (); \
|
abort (); \
|
\
|
\
|
\
|
\
|
if (isfinite (nan)) \
|
if (isfinite (nan)) \
|
abort (); \
|
abort (); \
|
\
|
\
|
if (isfinite (inf)) \
|
if (isfinite (inf)) \
|
abort (); \
|
abort (); \
|
\
|
\
|
if (isfinite (huge)) \
|
if (isfinite (huge)) \
|
abort (); \
|
abort (); \
|
\
|
\
|
if (!isfinite (norm1)) \
|
if (!isfinite (norm1)) \
|
abort (); \
|
abort (); \
|
\
|
\
|
if (!isfinite (norm2)) \
|
if (!isfinite (norm2)) \
|
abort (); \
|
abort (); \
|
\
|
\
|
if (!isfinite (norm3)) \
|
if (!isfinite (norm3)) \
|
abort (); \
|
abort (); \
|
\
|
\
|
if (!isfinite (sub)) \
|
if (!isfinite (sub)) \
|
abort (); \
|
abort (); \
|
\
|
\
|
if (!isfinite (zero)) \
|
if (!isfinite (zero)) \
|
abort (); \
|
abort (); \
|
\
|
\
|
\
|
\
|
if (isnormal (nan)) \
|
if (isnormal (nan)) \
|
abort (); \
|
abort (); \
|
\
|
\
|
if (isnormal (inf)) \
|
if (isnormal (inf)) \
|
abort (); \
|
abort (); \
|
\
|
\
|
if (isnormal (huge)) \
|
if (isnormal (huge)) \
|
abort (); \
|
abort (); \
|
\
|
\
|
if (!isnormal (norm1)) \
|
if (!isnormal (norm1)) \
|
abort (); \
|
abort (); \
|
\
|
\
|
if (!isnormal (norm2)) \
|
if (!isnormal (norm2)) \
|
abort (); \
|
abort (); \
|
\
|
\
|
if (!isnormal (norm3)) \
|
if (!isnormal (norm3)) \
|
abort (); \
|
abort (); \
|
\
|
\
|
if (isnormal (sub)) \
|
if (isnormal (sub)) \
|
abort (); \
|
abort (); \
|
\
|
\
|
if (isnormal (zero)) \
|
if (isnormal (zero)) \
|
abort (); \
|
abort (); \
|
\
|
\
|
\
|
\
|
if (!!signbit (nan) != neg) \
|
if (!!signbit (nan) != neg) \
|
abort (); \
|
abort (); \
|
\
|
\
|
if (!!signbit (inf) != neg) \
|
if (!!signbit (inf) != neg) \
|
abort (); \
|
abort (); \
|
\
|
\
|
if (!!signbit (huge) != neg) \
|
if (!!signbit (huge) != neg) \
|
abort (); \
|
abort (); \
|
\
|
\
|
if (!!signbit (norm1) != neg) \
|
if (!!signbit (norm1) != neg) \
|
abort (); \
|
abort (); \
|
\
|
\
|
if (!!signbit (norm2) != neg) \
|
if (!!signbit (norm2) != neg) \
|
abort (); \
|
abort (); \
|
\
|
\
|
if (!!signbit (norm3) != neg) \
|
if (!!signbit (norm3) != neg) \
|
abort (); \
|
abort (); \
|
\
|
\
|
if (!!signbit (sub) != neg) \
|
if (!!signbit (sub) != neg) \
|
abort (); \
|
abort (); \
|
\
|
\
|
if (!!signbit (zero) != neg) \
|
if (!!signbit (zero) != neg) \
|
abort (); \
|
abort (); \
|
\
|
\
|
\
|
\
|
if (neg) \
|
if (neg) \
|
{ \
|
{ \
|
if (!isless ((inf), (norm1))) \
|
if (!isless ((inf), (norm1))) \
|
abort (); \
|
abort (); \
|
\
|
\
|
if (!isless ((inf), (norm2))) \
|
if (!isless ((inf), (norm2))) \
|
abort (); \
|
abort (); \
|
\
|
\
|
if (!isless ((inf), (norm3))) \
|
if (!isless ((inf), (norm3))) \
|
abort (); \
|
abort (); \
|
\
|
\
|
if (!islessequal ((inf), (huge))) \
|
if (!islessequal ((inf), (huge))) \
|
abort (); \
|
abort (); \
|
\
|
\
|
if (!isgreater ((norm1), (inf))) \
|
if (!isgreater ((norm1), (inf))) \
|
abort (); \
|
abort (); \
|
\
|
\
|
if (!isgreater ((norm2), (inf))) \
|
if (!isgreater ((norm2), (inf))) \
|
abort (); \
|
abort (); \
|
\
|
\
|
if (!isgreater ((norm3), (inf))) \
|
if (!isgreater ((norm3), (inf))) \
|
abort (); \
|
abort (); \
|
\
|
\
|
if (!isgreaterequal ((huge), (inf))) \
|
if (!isgreaterequal ((huge), (inf))) \
|
abort (); \
|
abort (); \
|
} \
|
} \
|
else \
|
else \
|
{ \
|
{ \
|
if (!isgreater ((inf), (norm1))) \
|
if (!isgreater ((inf), (norm1))) \
|
abort (); \
|
abort (); \
|
\
|
\
|
if (!isgreater ((inf), (norm2))) \
|
if (!isgreater ((inf), (norm2))) \
|
abort (); \
|
abort (); \
|
\
|
\
|
if (!isgreater ((inf), (norm3))) \
|
if (!isgreater ((inf), (norm3))) \
|
abort (); \
|
abort (); \
|
\
|
\
|
if (!isgreaterequal ((inf), (huge))) \
|
if (!isgreaterequal ((inf), (huge))) \
|
abort (); \
|
abort (); \
|
\
|
\
|
if (!isless ((norm1), (inf))) \
|
if (!isless ((norm1), (inf))) \
|
abort (); \
|
abort (); \
|
\
|
\
|
if (!isless ((norm2), (inf))) \
|
if (!isless ((norm2), (inf))) \
|
abort (); \
|
abort (); \
|
\
|
\
|
if (!isless ((norm3), (inf))) \
|
if (!isless ((norm3), (inf))) \
|
abort (); \
|
abort (); \
|
\
|
\
|
if (!islessequal ((huge), (inf))) \
|
if (!islessequal ((huge), (inf))) \
|
abort (); \
|
abort (); \
|
} \
|
} \
|
\
|
\
|
if (!islessgreater ((inf), (norm1))) \
|
if (!islessgreater ((inf), (norm1))) \
|
abort (); \
|
abort (); \
|
\
|
\
|
if (!islessgreater ((inf), (norm2))) \
|
if (!islessgreater ((inf), (norm2))) \
|
abort (); \
|
abort (); \
|
\
|
\
|
if (!islessgreater ((inf), (norm3))) \
|
if (!islessgreater ((inf), (norm3))) \
|
abort (); \
|
abort (); \
|
\
|
\
|
if (!isunordered ((nan), (norm1))) \
|
if (!isunordered ((nan), (norm1))) \
|
abort (); \
|
abort (); \
|
\
|
\
|
if (!isunordered ((nan), (norm2))) \
|
if (!isunordered ((nan), (norm2))) \
|
abort (); \
|
abort (); \
|
\
|
\
|
if (!isunordered ((nan), (norm3))) \
|
if (!isunordered ((nan), (norm3))) \
|
abort (); \
|
abort (); \
|
\
|
\
|
\
|
\
|
if (fetestexcept (FE_ALL_EXCEPT) != 0) \
|
if (fetestexcept (FE_ALL_EXCEPT) != 0) \
|
abort(); \
|
abort(); \
|
}
|
}
|
|
|