author | nsz <nsz@port70.net> | 2012年03月18日 19:27:39 +0100 |
---|---|---|
committer | nsz <nsz@port70.net> | 2012年03月18日 19:27:39 +0100 |
commit | 9b6899f2c5cec70af6cea80ead7ba98fd2366ce9 (patch) | |
tree | b00581953a70005aaed0760cb62cd77bd269df5c /src/math/lrintl.c | |
parent | 9e2a895aaaa4a3985e94ae4f3e24c1af65f9bb34 (diff) | |
download | musl-9b6899f2c5cec70af6cea80ead7ba98fd2366ce9.tar.gz |
-rw-r--r-- | src/math/lrintl.c | 28 |
diff --git a/src/math/lrintl.c b/src/math/lrintl.c index c076326f..0e579bc5 100644 --- a/src/math/lrintl.c +++ b/src/math/lrintl.c @@ -1,5 +1,7 @@ -#include <math.h> -#include <float.h> +#include <limits.h> +#include <fenv.h> +#include "libm.h" + #if LDBL_MANT_DIG == 53 && LDBL_MAX_EXP == 1024 long lrintl(long double x) @@ -7,10 +9,22 @@ long lrintl(long double x) return lrint(x); } #else -#define type long double -#define roundit rintl -#define dtype long -#define fn lrintl +/* +see comments in lrint.c -#include "lrint.c" +Note that if LONG_MAX == 0x7fffffffffffffff && LDBL_MANT_DIG == 64 +then x == 2**63 - 0.5 is the only input that overflows and +raises inexact (with tonearest or upward rounding mode) +*/ +long lrintl(long double x) +{ + int e; + + e = fetestexcept(FE_INEXACT); + x = rintl(x); + if (!e && (x > LONG_MAX || x < LONG_MIN)) + feclearexcept(FE_INEXACT); + /* conversion */ + return x; +} #endif |