summaryrefslogtreecommitdiff
path: root/src/math
diff options
context:
space:
mode:
authorJakob Kaivo <jkk@ung.org>2019-03-03 15:03:36 -0500
committerJakob Kaivo <jkk@ung.org>2019-03-03 15:03:36 -0500
commitd767dff01337517e61deaf6da9f51158a3e4ffc5 (patch)
tree20ec2f8ef06c0c7175d0ffd80bac11282d681423 /src/math
parent689b06b8dfce4076826994a691120ea7cfce5af7 (diff)
purely inline signbit() implementation
Diffstat (limited to 'src/math')
-rw-r--r--src/math/signbit.c21
1 files changed, 16 insertions, 5 deletions
diff --git a/src/math/signbit.c b/src/math/signbit.c
index 3491a1e2..a5278e77 100644
--- a/src/math/signbit.c
+++ b/src/math/signbit.c
@@ -1,10 +1,21 @@
#include <math.h>
- int __signbitf(float x);
- int __signbitd(double x);
- int __signbitl(long double x);
-#define signbit(x) ((sizeof (x) == sizeof (float)) ? __signbitf(x) : \
- (sizeof (x) == sizeof (double)) ? __signbitd(x) : __signbitl(x))
+#define signbit(x) \
+ (sizeof(x) == sizeof(long double) ? \
+ ((((union { \
+ long double __f; \
+ char __c[sizeof(x)]; \
+ }){.__f = (x)}).__c[sizeof(x)-1] & 0x80) == 0x80 ? 1 : 0) : \
+ sizeof(x) == sizeof(double) ? \
+ ((((union { \
+ double __f; \
+ char __c[sizeof(x)]; \
+ }){.__f = (x)}).__c[sizeof(x)-1] & 0x80) == 0x80 ? 1 : 0) : \
+ (((union { \
+ float __f; \
+ char __c[sizeof(x)]; \
+ }){.__f = (x)}).__c[sizeof(x)-1] & 0x80) == 0x80 ? 1 : 0)
+
/*
STDC(199901)