1570af302Sopenharmony_ci#include <limits.h> 2570af302Sopenharmony_ci#include <fenv.h> 3570af302Sopenharmony_ci#include "libm.h" 4570af302Sopenharmony_ci 5570af302Sopenharmony_ci 6570af302Sopenharmony_ci#if LDBL_MANT_DIG == 53 && LDBL_MAX_EXP == 1024 7570af302Sopenharmony_cilong lrintl(long double x) 8570af302Sopenharmony_ci{ 9570af302Sopenharmony_ci return lrint(x); 10570af302Sopenharmony_ci} 11570af302Sopenharmony_ci#elif defined(FE_INEXACT) 12570af302Sopenharmony_ci/* 13570af302Sopenharmony_cisee comments in lrint.c 14570af302Sopenharmony_ci 15570af302Sopenharmony_ciNote that if LONG_MAX == 0x7fffffffffffffff && LDBL_MANT_DIG == 64 16570af302Sopenharmony_cithen x == 2**63 - 0.5 is the only input that overflows and 17570af302Sopenharmony_ciraises inexact (with tonearest or upward rounding mode) 18570af302Sopenharmony_ci*/ 19570af302Sopenharmony_cilong lrintl(long double x) 20570af302Sopenharmony_ci{ 21570af302Sopenharmony_ci #pragma STDC FENV_ACCESS ON 22570af302Sopenharmony_ci int e; 23570af302Sopenharmony_ci 24570af302Sopenharmony_ci e = fetestexcept(FE_INEXACT); 25570af302Sopenharmony_ci x = rintl(x); 26570af302Sopenharmony_ci if (!e && (x > LONG_MAX || x < LONG_MIN)) 27570af302Sopenharmony_ci feclearexcept(FE_INEXACT); 28570af302Sopenharmony_ci /* conversion */ 29570af302Sopenharmony_ci return x; 30570af302Sopenharmony_ci} 31570af302Sopenharmony_ci#else 32570af302Sopenharmony_cilong lrintl(long double x) 33570af302Sopenharmony_ci{ 34570af302Sopenharmony_ci return rintl(x); 35570af302Sopenharmony_ci} 36570af302Sopenharmony_ci#endif 37