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