diff options
author | Jakob Kaivo <jkk@ung.org> | 2019-03-03 15:03:36 -0500 |
---|---|---|
committer | Jakob Kaivo <jkk@ung.org> | 2019-03-03 15:03:36 -0500 |
commit | d767dff01337517e61deaf6da9f51158a3e4ffc5 (patch) | |
tree | 20ec2f8ef06c0c7175d0ffd80bac11282d681423 /src/math | |
parent | 689b06b8dfce4076826994a691120ea7cfce5af7 (diff) |
purely inline signbit() implementation
Diffstat (limited to 'src/math')
-rw-r--r-- | src/math/signbit.c | 21 |
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) |