Loading...
#include <limits.h> #include <fenv.h> #include "libm.h" #if LDBL_MANT_DIG == 53 && LDBL_MAX_EXP == 1024 long lrintl(long double x) { return lrint(x); } #elif defined(FE_INEXACT) /* see comments in lrint.c Note that if LONG_MAX == 0x7fffffffffffffff && LDBL_MANT_DIG == 64 then x == 2**63 - 0.5 is the only input that overflows and raises inexact (with tonearest or upward rounding mode) */ long lrintl(long double x) { #pragma STDC FENV_ACCESS ON int e; e = fetestexcept(FE_INEXACT); x = rintl(x); if (!e && (x > LONG_MAX || x < LONG_MIN)) feclearexcept(FE_INEXACT); /* conversion */ return x; } #else long lrintl(long double x) { return rintl(x); } #endif |