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)6 long 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)17 long 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)29 long long llrintl(long double x) {
30     return rintl(x);
31 }
32 #endif
33