From b4e3f2f94a505c800e895764e429ec9ec310d9b4 Mon Sep 17 00:00:00 2001 From: mike Date: Sat, 8 Feb 2003 20:37:55 +0000 Subject: 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 , and provide double_t and float_t typedefs in . o Add some C99 manifest constants (FP_ILOGB0, FP_ILOGBNAN, HUGE_VALF, HUGE_VALL, INFINITY, NAN, and return values for fpclassify()) to and others (FLT_EVAL_METHOD, DECIMAL_DIG) to via . 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 (significant portions) Reviewed by: bde, fenner (earlier versions) --- lib/msun/src/math.h | 32 ++++++++++++++++++++++++++++++++ 1 file changed, 32 insertions(+) (limited to 'lib/msun/src') 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 + /* * 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); -- cgit v1.1