From 190c52aac5a1e3b1378ba9c81d78203103c458fb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Axel=20D=C3=B6rfler?= Date: Sat, 13 Mar 2004 18:49:41 +0000 Subject: [PATCH] A BeOS compatible math.h rewritten from scratch. git-svn-id: file:///srv/svn/repos/haiku/trunk/current@6963 a95241bf-73f2-0310-859d-f6bbb57e9c96 --- headers/posix/math.h | 485 ++++++++++++++++++++----------------------- 1 file changed, 221 insertions(+), 264 deletions(-) diff --git a/headers/posix/math.h b/headers/posix/math.h index 1e34e0832a..97d25722f3 100644 --- a/headers/posix/math.h +++ b/headers/posix/math.h @@ -1,292 +1,249 @@ -/* - * ==================================================== - * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved. - * - * Developed at SunPro, a Sun Microsystems, Inc. business. - * Permission to use, copy, modify, and distribute this - * software is freely granted, provided that this notice - * is preserved. - * ==================================================== - */ - -/* - * from: @(#)fdlibm.h 5.1 93/09/24 - * $FreeBSD: src/lib/msun/src/math.h,v 1.8 1999/08/28 00:06:42 peter Exp $ - */ - +/* +** Distributed under the terms of the OpenBeOS License. +*/ #ifndef _MATH_H_ #define _MATH_H_ -/* - * ANSI/POSIX - */ -extern char __infinity[]; -#define HUGE_VAL (*(double *) __infinity) -/* - * XOPEN/SVID - */ -#if !defined(_ANSI_SOURCE) && !defined(_POSIX_SOURCE) -#define M_E 2.7182818284590452354 /* e */ -#define M_LOG2E 1.4426950408889634074 /* log 2e */ -#define M_LOG10E 0.43429448190325182765 /* log 10e */ -#define M_LN2 0.69314718055994530942 /* log e2 */ -#define M_LN10 2.30258509299404568402 /* log e10 */ -#define M_PI 3.14159265358979323846 /* pi */ -#define M_PI_2 1.57079632679489661923 /* pi/2 */ -#define M_PI_4 0.78539816339744830962 /* pi/4 */ -#define M_1_PI 0.31830988618379067154 /* 1/pi */ -#define M_2_PI 0.63661977236758134308 /* 2/pi */ -#define M_2_SQRTPI 1.12837916709551257390 /* 2/sqrt(pi) */ -#define M_SQRT2 1.41421356237309504880 /* sqrt(2) */ -#define M_SQRT1_2 0.70710678118654752440 /* 1/sqrt(2) */ +#define M_E 2.7182818284590452354 /* e */ +#define M_LOG2E 1.4426950408889634074 /* log 2e */ +#define M_LOG10E 0.43429448190325182765 /* log 10e */ +#define M_LN2 0.69314718055994530942 /* log e2 */ +#define M_LN10 2.30258509299404568402 /* log e10 */ +#define M_PI 3.14159265358979323846 /* pi */ +#define M_PI_2 1.57079632679489661923 /* pi/2 */ +#define M_PI_4 0.78539816339744830962 /* pi/4 */ +#define M_1_PI 0.31830988618379067154 /* 1/pi */ +#define M_2_PI 0.63661977236758134308 /* 2/pi */ +#define M_2_SQRTPI 1.12837916709551257390 /* 2/sqrt(pi) */ +#define M_SQRT2 1.41421356237309504880 /* sqrt(2) */ +#define M_SQRT1_2 0.70710678118654752440 /* 1/sqrt(2) */ -#ifndef PI -#define PI M_PI -#endif -#ifndef PI2 -#define PI2 M_PI_2 +#define PI M_PI +#define PI2 M_PI_2 + +/* platform independent IEEE floating point special values */ +#define __HUGE_VAL_v 0x7ff0000000000000LL +#define __huge_val_t union { unsigned char __c[8]; long long __ll; double __d; } +#define HUGE_VAL (((__huge_val_t) { __ll: __HUGE_VAL_v }).__d) + +#define __HUGE_VALF_v 0x7f800000L +#define __huge_valf_t union { unsigned char __c[4]; long __l; float __f; } +#define HUGE_VALF (((__huge_valf_t) { __l: __HUGE_VALF_v }).__f) + +// ToDo: define HUGE_VALL for long doubles + +#define __NAN_VALF_v 0x7fc00000L +#define NAN (((__huge_valf_t) { __l: __NAN_VALF_v }).__f) + +#define INFINITY HUGE_VALF + +/* floating-point categories */ +#define FP_NAN 0 +#define FP_INFINITE 1 +#define FP_ZERO 2 +#define FP_SUBNORMAL 3 +#define FP_NORMAL 4 + +#ifdef __cplusplus +struct __exception; +extern "C" int matherr(struct __exception *); +struct __exception { +#else +struct exception; +extern int matherr(struct exception *); +struct exception { #endif + int type; + char *name; + double arg1; + double arg2; + double retval; +}; + +#define DOMAIN 1 +#define SING 2 +#define OVERFLOW 3 +#define UNDERFLOW 4 +#define TLOSS 5 +#define PLOSS 6 -#define MAXFLOAT ((float)3.40282346638528860e+38) extern int signgam; -#if !defined(_XOPEN_SOURCE) -enum fdversion {fdlibm_ieee = -1, fdlibm_svid, fdlibm_xopen, fdlibm_posix}; - -#define _LIB_VERSION_TYPE enum fdversion -#define _LIB_VERSION _fdlib_version - -/* if global variable _LIB_VERSION is not desirable, one may - * change the following to be a constant by: - * #define _LIB_VERSION_TYPE const enum version - * In that case, after one initializes the value _LIB_VERSION (see - * s_lib_version.c) during compile time, it cannot be modified - * in the middle of a program - */ -extern _LIB_VERSION_TYPE _LIB_VERSION; - -#define _IEEE_ fdlibm_ieee -#define _SVID_ fdlibm_svid -#define _XOPEN_ fdlibm_xopen -#define _POSIX_ fdlibm_posix - -#ifndef __cplusplus -struct exception { - int type; - char *name; - double arg1; - double arg2; - double retval; -}; -#endif - -#define HUGE MAXFLOAT - -/* - * set X_TLOSS = pi*2**52, which is possibly defined in - * (one may replace the following line by "#include ") - */ - -#define X_TLOSS 1.41484755040568800000e+16 - -#define DOMAIN 1 -#define SING 2 -#define OVERFLOW 3 -#define UNDERFLOW 4 -#define TLOSS 5 -#define PLOSS 6 - -#endif /* !_XOPEN_SOURCE */ -#endif /* !_ANSI_SOURCE && !_POSIX_SOURCE */ - #ifdef __cplusplus -extern "C" -{ +extern "C" { #endif -/* - * ANSI/POSIX - */ -extern double acos(double); -extern double asin(double); -extern double atan(double); -extern double atan2(double, double); -extern double cos(double); -extern double sin(double); -extern double tan(double); +extern double acos(double x); +extern double asin(double x); +extern double atan(double x); +extern double atan2(double x, double y); +extern double ceil(double x); +extern double cos(double x); +extern double cosh(double x); +extern double exp(double x); +extern double fabs(double x); +extern double floor(double x); +extern double fmod(double x, double y); +extern double frexp(double x, int *_exponent); +extern double ldexp(double x, int exponent); +extern double log(double x); +extern double log10(double x); +extern double modf(double x, double *y); +extern double pow(double x, double y); +extern double sin(double x); +extern double sinh(double x); +extern double sqrt(double x); +extern double tan(double x); +extern double tanh(double x); -extern double cosh(double); -extern double sinh(double); -extern double tanh(double); +/* some BSD non-ANSI or POSIX math functions */ +extern double acosh(double x); +extern double asinh(double x); +extern double atanh(double x); +extern double cbrt(double x); +extern double erf(double x); +extern double erfc(double x); +extern double expm1(double x); +extern double gamma(double x); +extern double gamma_r(double x, int *y); +extern double hypot(double x, double y); +extern int ilogb(double x); +extern double j0(double x); +extern double j1(double x); +extern double jn(int x, double y); +extern double lgamma(double x); +extern double lgamma_r(double x, int *y); +extern double log1p(double x); +extern double logb(double x); +extern double nextafter(double x, double y); +extern double remainder(double x, double y); +extern double rint(double x); +extern double scalb (double x, double y); +extern double y0(double x); +extern double y1(double x); +extern double yn(int x, double y); -extern double exp(double); -extern double frexp(double, int *); -extern double ldexp(double, int); -extern double log(double); -extern double log10(double); -extern double modf(double, double *); +/* other stuff as defined in BeOS */ +extern double significand(double x); +extern double copysign(double x, double y); +extern double scalbn(double x, int y); +extern double drem(double x, double y); +extern int isnan(double x); +extern int isfinite(double x); +extern int finite(double x); +extern float modff(float x, float *y); +extern float acosf(float x); +extern float asinf(float x); +extern float atanf(float x); +extern float atan2f(float y, float x); +extern float cosf(float x); +extern float sinf(float x); +extern float tanf(float x); +extern float coshf(float x); +extern float sinhf(float x); +extern float tanhf(float x); +extern float acoshf(float x); +extern float asinhf(float x); +extern float atanhf(float x); +extern float expf(float x); +extern float frexpf(float x, int *_exponent); +extern float ldexpf(float x, int exponent); +extern float logf(float x); +extern float log10f(float x); +extern float expm1f(float x); +extern float log1pf(float x); +extern float logbf(float x); +extern float powf(float x, float y); +extern float sqrtf(float x); +extern float hypotf(float x, float y); +extern float cbrtf(float x); +extern float ceilf(float x); +extern float fabsf(float x); +extern float floorf(float x); +extern float fmodf(float x, float y); +extern int isinff(float value); +extern int finitef(float value); +extern float infnanf(int error); +extern float dremf(float x, float y); +extern float significandf(float x); +extern float copysignf(float x, float y); +extern int isnanf(float value); +extern float j0f(float x); +extern float j1f(float x); +extern float jnf(int x, float y); +extern float y0f(float x); +extern float y1f(float x); +extern float ynf(int x, float y); +extern float erff(float x); +extern float erfcf(float x); +extern float gammaf(float x); +extern float lgammaf(float x); +extern float gammaf_r(float x, int *y); +extern float lgammaf_r(float x, int *y); +extern float rintf(float x); +extern float nextafterf(float x, float y); +extern float remainderf(float x, float y); +extern float scalbf(float x, float n); +extern float scalbnf(float x, int n); +extern int ilogbf(float x); -extern double pow(double, double); -extern double sqrt(double); +/* prototypes for functions used in the macros below */ +extern int __fpclassifyf(float value); +extern int __signbitf(float value); +extern int __finitef(float value); +extern int __isnanf(float value); +extern int __isinff(float value); -extern double ceil(double); -extern double fabs(double); -extern double floor(double); -extern double fmod(double, double); +extern int __fpclassifyl(long double value); +extern int __signbitl(long double value); +extern int __finitel(long double value); +extern int __isnanl(long double value); +extern int __isinfl(long double value); -#if !defined(_ANSI_SOURCE) && !defined(_POSIX_SOURCE) -extern double erf(double); -extern double erfc(double); -extern double gamma(double); -extern double hypot(double, double); -extern int isinf(double); -extern int isnan(double); -extern int finite(double); -extern double j0(double); -extern double j1(double); -extern double jn(int, double); -extern double lgamma(double); -extern double y0(double); -extern double y1(double); -extern double yn(int, double); +extern int __fpclassify(double value); +extern int __signbit(double value); +extern int __finite(double value); +extern int __isnan(double value); +extern int __isinf(double value); -#if !defined(_XOPEN_SOURCE) -extern double acosh(double); -extern double asinh(double); -extern double atanh(double); -extern double cbrt(double); -extern double logb(double); -extern double nextafter(double, double); -extern double remainder(double, double); -extern double scalb(double, double); +/* returns number of classification appropriate for 'value' */ +#define fpclassify(value) \ + (sizeof(value) == sizeof(float) ? __fpclassifyf(value) \ + : sizeof(value) == sizeof(double) ? __fpclassify(value) \ + : __fpclassifyl(value)) -#ifndef __cplusplus -extern int matherr(struct exception *); -#endif +/* returns non-zero if 'value' is negative */ +# define signbit(value) \ + (sizeof(value) == sizeof(float) ? __signbitf(value) \ + : sizeof(value) == sizeof(double) ? __signbit(value) \ + : __signbitl(value)) -/* - * IEEE Test Vector - */ -extern double significand(double); +/* returns non-zero if 'value' is not Inf or NaN */ +# define isfinite(value) \ + (sizeof(value) == sizeof(float) ? __finitef(value) \ + : sizeof(value) == sizeof(double) ? __finite(value) \ + : __finitel(value)) -/* - * Functions callable from C, intended to support IEEE arithmetic. - */ -extern double copysign(double, double); -extern int ilogb(double); -extern double rint(double); -extern double scalbn(double, int); +/* returns non-zero if 'value' is neither zero, sub-normal, Inf, nor NaN */ +# define isnormal(value) \ + (fpclassify(value) == FP_NORMAL) -/* - * BSD math library entry points - */ -struct complex { double x, y; }; -extern double cabs(struct complex); -extern double drem(double, double); -extern double expm1(double); -extern double log1p(double); -extern double z_abs(struct complex const *); /* complete non standard */ +/* returns non-zero if 'value' is NaN */ +# define isnan(value) \ + (sizeof(value) == sizeof(float) ? __isnanf(value) \ + : sizeof(value) == sizeof(double) ? __isnan(value) \ + : __isnanl(value)) -/* - * Reentrant version of gamma & lgamma; passes signgam back by reference - * as the second argument; user must allocate space for signgam. - */ -#ifdef _REENTRANT -extern double gamma_r(double, int *); -extern double lgamma_r(double, int *); -#endif /* _REENTRANT */ - - -/* float versions of ANSI/POSIX functions */ -extern float acosf(float); -extern float asinf(float); -extern float atanf(float); -extern float atan2f(float, float); -extern float cosf(float); -extern float sinf(float); -extern float tanf(float); - -extern float coshf(float); -extern float sinhf(float); -extern float tanhf(float); - -extern float expf(float); -extern float frexpf(float, int *); -extern float ldexpf(float, int); -extern float logf(float); -extern float log10f(float); -extern float modff(float, float *); - -extern float powf(float, float); -extern float sqrtf(float); - -extern float ceilf(float); -extern float fabsf(float); -extern float floorf(float); -extern float fmodf(float, float); - -extern float erff(float); -extern float erfcf(float); -extern float gammaf(float); -extern float hypotf(float, float); -extern int isnanf(float); -extern int finitef(float); -extern float j0f(float); -extern float j1f(float); -extern float jnf(int, float); -extern float lgammaf(float); -extern float y0f(float); -extern float y1f(float); -extern float ynf(int, float); - -extern float acoshf(float); -extern float asinhf(float); -extern float atanhf(float); -extern float cbrtf(float); -extern float logbf(float); -extern float nextafterf(float, float); -extern float remainderf(float, float); -extern float scalbf(float, float); - -/* - * float version of IEEE Test Vector - */ -extern float significandf(float); - -/* - * Float versions of functions callable from C, intended to support - * IEEE arithmetic. - */ -extern float copysignf(float, float); -extern int ilogbf(float); -extern float rintf(float); -extern float scalbnf(float, int); - -/* - * float versions of BSD math library entry points - */ -extern float cabsf (); -extern float dremf(float, float); -extern float expm1f(float); -extern float log1pf(float); - -/* - * Float versions of reentrant version of gamma & lgamma; passes - * signgam back by reference as the second argument; user must - * allocate space for signgam. - */ -#ifdef _REENTRANT -extern float gammaf_r(float, int *); -extern float lgammaf_r(float, int *); -#endif /* _REENTRANT */ - -#endif /* !_XOPEN_SOURCE */ -#endif /* !_ANSI_SOURCE && !_POSIX_SOURCE */ +/* returns non-zero if 'value is Inf */ +# define isinf(x) \ + (sizeof(value) == sizeof(float) ? __isinff(value) \ + : sizeof(value) == sizeof(double) ? __isinf(value) \ + : __isinfl(value)) #ifdef __cplusplus -} /* "C" */ +} #endif -#endif /* _MATH_H_ */ +#endif /* _MATH_H_ */