diff options
Diffstat (limited to 'src/math/signbit.c')
| -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) |
