musl - musl - an implementation of the standard library for Linux-based systems

index : musl
musl - an implementation of the standard library for Linux-based systems
summary refs log tree commit diff
path: root/src/math/lrintl.c
diff options
context:
space:
mode:
authornsz <nsz@port70.net>2012年03月18日 19:27:39 +0100
committernsz <nsz@port70.net>2012年03月18日 19:27:39 +0100
commit9b6899f2c5cec70af6cea80ead7ba98fd2366ce9 (patch)
treeb00581953a70005aaed0760cb62cd77bd269df5c /src/math/lrintl.c
parent9e2a895aaaa4a3985e94ae4f3e24c1af65f9bb34 (diff)
downloadmusl-9b6899f2c5cec70af6cea80ead7ba98fd2366ce9.tar.gz
faster lrint and llrint functions
A faster workaround for spurious inexact exceptions when the result cannot be represented. The old code actually could be wrong, because gcc reordered the integer conversion and the exception check.
Diffstat (limited to 'src/math/lrintl.c')
-rw-r--r--src/math/lrintl.c 28
1 files changed, 21 insertions, 7 deletions
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
generated by cgit v1.2.1 (git 2.18.0) at 2025年10月05日 17:57:49 +0000

AltStyle によって変換されたページ (->オリジナル) /