From d767dff01337517e61deaf6da9f51158a3e4ffc5 Mon Sep 17 00:00:00 2001 From: Jakob Kaivo Date: Sun, 3 Mar 2019 15:03:36 -0500 Subject: purely inline signbit() implementation --- src/math/signbit.c | 21 ++++++++++++++++----- 1 file changed, 16 insertions(+), 5 deletions(-) (limited to 'src/math/signbit.c') 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 - 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) -- cgit v1.2.1