#include <limits.h> | |
#include <fenv.h> | |
#include "libm.h" | |
#if LDBL_MANT_DIG == 53 && LDBL_MAX_EXP == 1024 | |
long long llrintl(long double x) | |
{ | |
return llrint(x); | |
} | |
#elif defined(FE_INEXACT) | |
/* | |
see comments in lrint.c | |
Note that if LLONG_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 long llrintl(long double x) | |
{ | |
#pragma STDC FENV_ACCESS ON | |
int e; | |
e = fetestexcept(FE_INEXACT); | |
x = rintl(x); | |
if (!e && (x > LLONG_MAX || x < LLONG_MIN)) | |
feclearexcept(FE_INEXACT); | |
/* conversion */ | |
return x; | |
} | |
#else | |
long long llrintl(long double x) | |
{ | |
return rintl(x); | |
} | |
#endif |