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