diff options
| author | rsc <devnull@localhost> | 2004-02-29 22:11:15 +0000 |
|---|---|---|
| committer | rsc <devnull@localhost> | 2004-02-29 22:11:15 +0000 |
| commit | 91c13e54b5d631b65e2f8344d5e0abd058f78ba1 (patch) | |
| tree | 81d77fc6a74f182543603032462e865e34e43335 /src/lib9/fmt/nan64.c | |
| parent | 5a8e63b2f016735364d17866d5e2bcb35d20c78b (diff) | |
| download | plan9port-91c13e54b5d631b65e2f8344d5e0abd058f78ba1.tar.gz plan9port-91c13e54b5d631b65e2f8344d5e0abd058f78ba1.zip | |
Move utf, fmt. Small header file changes.
Diffstat (limited to 'src/lib9/fmt/nan64.c')
| -rw-r--r-- | src/lib9/fmt/nan64.c | 76 |
1 files changed, 76 insertions, 0 deletions
diff --git a/src/lib9/fmt/nan64.c b/src/lib9/fmt/nan64.c new file mode 100644 index 00000000..a02a3adb --- /dev/null +++ b/src/lib9/fmt/nan64.c @@ -0,0 +1,76 @@ +/* + * 64-bit IEEE not-a-number routines. + * This is big/little-endian portable assuming that + * the 64-bit doubles and 64-bit integers have the + * same byte ordering. + */ + +#include "nan.h" + +#ifdef __APPLE__ +#define _NEEDLL +#endif + +typedef unsigned long long uvlong; +typedef unsigned long ulong; + +#ifdef _NEEDLL +static uvlong uvnan = 0x7FF0000000000001LL; +static uvlong uvinf = 0x7FF0000000000000LL; +static uvlong uvneginf = 0xFFF0000000000000LL; +#else +static uvlong uvnan = 0x7FF0000000000001; +static uvlong uvinf = 0x7FF0000000000000; +static uvlong uvneginf = 0xFFF0000000000000; +#endif + +double +__NaN(void) +{ + uvlong *p; + + /* gcc complains about "return *(double*)&uvnan;" */ + p = &uvnan; + return *(double*)p; +} + +int +__isNaN(double d) +{ + uvlong x; + double *p; + + p = &d; + x = *(uvlong*)p; + return (ulong)(x>>32)==0x7FF00000 && !__isInf(d, 0); +} + +double +__Inf(int sign) +{ + uvlong *p; + + if(sign < 0) + p = &uvinf; + else + p = &uvneginf; + return *(double*)p; +} + +int +__isInf(double d, int sign) +{ + uvlong x; + double *p; + + p = &d; + x = *(uvlong*)p; + if(sign == 0) + return x==uvinf || x==uvneginf; + else if(sign > 0) + return x==uvinf; + else + return x==uvneginf; +} + + |
