summaryrefslogtreecommitdiffstats
path: root/lib/msun
diff options
context:
space:
mode:
authormike <mike@FreeBSD.org>2003-02-08 20:37:55 +0000
committermike <mike@FreeBSD.org>2003-02-08 20:37:55 +0000
commitb4e3f2f94a505c800e895764e429ec9ec310d9b4 (patch)
tree5fa8c1927e480809720c766a3f48569e33c80af9 /lib/msun
parent9c57bdd382a4547a47c07bb50cb31b20e614f0c9 (diff)
downloadFreeBSD-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.h32
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);
OpenPOWER on IntegriCloud