diff options
author | mike <mike@FreeBSD.org> | 2003-02-08 20:37:55 +0000 |
---|---|---|
committer | mike <mike@FreeBSD.org> | 2003-02-08 20:37:55 +0000 |
commit | b4e3f2f94a505c800e895764e429ec9ec310d9b4 (patch) | |
tree | 5fa8c1927e480809720c766a3f48569e33c80af9 /lib/msun | |
parent | 9c57bdd382a4547a47c07bb50cb31b20e614f0c9 (diff) | |
download | FreeBSD-src-b4e3f2f94a505c800e895764e429ec9ec310d9b4.zip FreeBSD-src-b4e3f2f94a505c800e895764e429ec9ec310d9b4.tar.gz |
Implement fpclassify():
o Add a MD header private to libc called _fpmath.h; this header
contains bitfield layouts of MD floating-point types.
o Add a MI header private to libc called fpmath.h; this header
contains bitfield layouts of MI floating-point types.
o Add private libc variables to lib/libc/$arch/gen/infinity.c for
storing NaN values.
o Add __double_t and __float_t to <machine/_types.h>, and provide
double_t and float_t typedefs in <math.h>.
o Add some C99 manifest constants (FP_ILOGB0, FP_ILOGBNAN, HUGE_VALF,
HUGE_VALL, INFINITY, NAN, and return values for fpclassify()) to
<math.h> and others (FLT_EVAL_METHOD, DECIMAL_DIG) to <float.h> via
<machine/float.h>.
o Add C99 macro fpclassify() which calls __fpclassify{d,f,l}() based
on the size of its argument. __fpclassifyl() is never called on
alpha because (sizeof(long double) == sizeof(double)), which is good
since __fpclassifyl() can't deal with such a small `long double'.
This was developed by David Schultz and myself with input from bde and
fenner.
PR: 23103
Submitted by: David Schultz <dschultz@uclink.Berkeley.EDU>
(significant portions)
Reviewed by: bde, fenner (earlier versions)
Diffstat (limited to 'lib/msun')
-rw-r--r-- | lib/msun/src/math.h | 32 |
1 files changed, 32 insertions, 0 deletions
diff --git a/lib/msun/src/math.h b/lib/msun/src/math.h index 655b182..abeca6e 100644 --- a/lib/msun/src/math.h +++ b/lib/msun/src/math.h @@ -17,6 +17,8 @@ #ifndef _MATH_H_ #define _MATH_H_ +#include <sys/_types.h> + /* * ANSI/POSIX */ @@ -24,7 +26,33 @@ extern const union __infinity_un { unsigned char __uc[8]; double __ud; } __infinity; + +extern const union __nan_un { + unsigned char __uc[sizeof(float)]; + float __uf; +} __nan; + +#define FP_ILOGB0 (-0x7fffffff - 1) /* INT_MIN */ +#define FP_ILOGBNAN 0x7fffffff /* INT_MAX */ #define HUGE_VAL (__infinity.__ud) +#define HUGE_VALF (float)HUGE_VAL +#define HUGE_VALL (long double)HUGE_VAL +#define INFINITY HUGE_VALF +#define NAN (__nan.__uf) + +/* Symbolic constants to classify floating point numbers. */ +#define FP_INFINITE 1 +#define FP_NAN 2 +#define FP_NORMAL 3 +#define FP_SUBNORMAL 4 +#define FP_ZERO 5 +#define fpclassify(x) \ + ((sizeof (x) == sizeof (float)) ? __fpclassifyf(x) \ + : (sizeof (x) == sizeof (double)) ? __fpclassifyd(x) \ + : __fpclassifyl(x)) + +typedef __double_t double_t; +typedef __float_t float_t; /* * XOPEN/SVID @@ -116,6 +144,10 @@ __BEGIN_DECLS /* * ANSI/POSIX */ +int __fpclassifyd(double); +int __fpclassifyf(float); +int __fpclassifyl(long double); + double acos(double); double asin(double); double atan(double); |