1 #include "libm.h" 2 #include <fenv.h> 3 #include <limits.h> 4 5 #if LDBL_MANT_DIG == 53 && LDBL_MAX_EXP == 1024 llrintl(long double x)6long long llrintl(long double x) { 7 return llrint(x); 8 } 9 #elif defined(FE_INEXACT) 10 /* 11 see comments in lrint.c 12 13 Note that if LLONG_MAX == 0x7fffffffffffffff && LDBL_MANT_DIG == 64 14 then x == 2**63 - 0.5 is the only input that overflows and 15 raises inexact (with tonearest or upward rounding mode) 16 */ llrintl(long double x)17long long llrintl(long double x) { 18 PRAGMA_STDC_FENV_ACCESS_ON 19 int e; 20 21 e = fetestexcept(FE_INEXACT); 22 x = rintl(x); 23 if (!e && (x > LLONG_MAX || x < LLONG_MIN)) 24 feclearexcept(FE_INEXACT); 25 /* conversion */ 26 return x; 27 } 28 #else llrintl(long double x)29long long llrintl(long double x) { 30 return rintl(x); 31 } 32 #endif 33