Home | History | Annotate | Line # | Download | only in include
math.h revision 1.34.2.2
      1  1.34.2.2        he /*	$NetBSD: math.h,v 1.34.2.2 2004/07/16 20:32:10 he Exp $	*/
      2      1.10       cgd 
      3       1.1       cgd /*
      4       1.6       jtc  * ====================================================
      5       1.6       jtc  * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
      6       1.1       cgd  *
      7       1.6       jtc  * Developed at SunPro, a Sun Microsystems, Inc. business.
      8       1.6       jtc  * Permission to use, copy, modify, and distribute this
      9       1.6       jtc  * software is freely granted, provided that this notice
     10       1.6       jtc  * is preserved.
     11       1.6       jtc  * ====================================================
     12       1.1       cgd  */
     13       1.1       cgd 
     14       1.6       jtc /*
     15      1.10       cgd  * @(#)fdlibm.h 5.1 93/09/24
     16       1.6       jtc  */
     17       1.1       cgd 
     18       1.6       jtc #ifndef _MATH_H_
     19       1.7       cgd #define _MATH_H_
     20       1.1       cgd 
     21      1.21    kleink #include <sys/cdefs.h>
     22      1.12    kleink #include <sys/featuretest.h>
     23      1.24    simonb 
     24      1.24    simonb union __float_u {
     25      1.24    simonb 	unsigned char __dummy[sizeof(float)];
     26      1.24    simonb 	float __val;
     27      1.24    simonb };
     28      1.24    simonb 
     29      1.24    simonb union __double_u {
     30      1.24    simonb 	unsigned char __dummy[sizeof(double)];
     31      1.24    simonb 	double __val;
     32      1.24    simonb };
     33      1.24    simonb 
     34      1.26   thorpej union __long_double_u {
     35      1.26   thorpej 	unsigned char __dummy[sizeof(long double)];
     36      1.26   thorpej 	long double __val;
     37      1.26   thorpej };
     38      1.26   thorpej 
     39      1.26   thorpej #include <machine/math.h>		/* may use __float_u, __double_u,
     40      1.26   thorpej 					   or __long_double_u */
     41      1.12    kleink 
     42      1.29    kleink #ifdef __HAVE_LONG_DOUBLE
     43      1.29    kleink #define	__fpmacro_unary_floating(__name, __arg0)			\
     44      1.33    kleink 	/* LINTED */							\
     45      1.29    kleink 	((sizeof (__arg0) == sizeof (float))				\
     46      1.29    kleink 	?	__ ## __name ## f (__arg0)				\
     47      1.29    kleink 	: (sizeof (__arg0) == sizeof (double))				\
     48      1.29    kleink 	?	__ ## __name ## d (__arg0)				\
     49      1.29    kleink 	:	__ ## __name ## l (__arg0))
     50      1.29    kleink #else
     51      1.29    kleink #define	__fpmacro_unary_floating(__name, __arg0)			\
     52      1.33    kleink 	/* LINTED */							\
     53      1.29    kleink 	((sizeof (__arg0) == sizeof (float))				\
     54      1.29    kleink 	?	__ ## __name ## f (__arg0)				\
     55      1.29    kleink 	:	__ ## __name ## d (__arg0))
     56      1.30       uwe #endif /* __HAVE_LONG_DOUBLE */
     57      1.29    kleink 
     58       1.1       cgd /*
     59       1.6       jtc  * ANSI/POSIX
     60       1.6       jtc  */
     61      1.28    kleink /* 7.12#3 HUGE_VAL, HUGELF, HUGE_VALL */
     62      1.24    simonb extern __const union __double_u __infinity;
     63      1.24    simonb #define HUGE_VAL	__infinity.__val
     64      1.24    simonb 
     65      1.24    simonb /*
     66      1.24    simonb  * ISO C99
     67      1.24    simonb  */
     68      1.27    kleink #if !defined(_ANSI_SOURCE) && !defined(_POSIX_C_SOURCE) && \
     69      1.27    kleink     !defined(_XOPEN_SOURCE) || \
     70      1.27    kleink     ((__STDC_VERSION__ - 0) >= 199901L) || \
     71      1.27    kleink     ((_POSIX_C_SOURCE - 0) >= 200112L) || \
     72      1.27    kleink     ((_XOPEN_SOURCE  - 0) >= 600) || \
     73      1.27    kleink     defined(_ISOC99_SOURCE) || defined(_NETBSD_SOURCE)
     74      1.28    kleink /* 7.12#3 HUGE_VAL, HUGELF, HUGE_VALL */
     75      1.27    kleink extern __const union __float_u __infinityf;
     76      1.27    kleink #define	HUGE_VALF	__infinityf.__val
     77      1.27    kleink 
     78      1.27    kleink extern __const union __long_double_u __infinityl;
     79      1.27    kleink #define	HUGE_VALL	__infinityl.__val
     80      1.27    kleink 
     81      1.28    kleink /* 7.12#4 INFINITY */
     82      1.28    kleink #ifdef __INFINITY
     83      1.28    kleink #define	INFINITY	__INFINITY	/* float constant which overflows */
     84      1.28    kleink #else
     85      1.28    kleink #define	INFINITY	HUGE_VALF	/* positive infinity */
     86      1.28    kleink #endif /* __INFINITY */
     87      1.28    kleink 
     88      1.28    kleink /* 7.12#5 NAN: a quiet NaN, if supported */
     89      1.27    kleink #ifdef __HAVE_NANF
     90      1.24    simonb extern __const union __float_u __nanf;
     91      1.24    simonb #define	NAN		__nanf.__val
     92      1.27    kleink #endif /* __HAVE_NANF */
     93      1.29    kleink 
     94      1.29    kleink /* 7.12#6 number classification macros */
     95      1.29    kleink #define	FP_INFINITE	0x00
     96      1.29    kleink #define	FP_NAN		0x01
     97      1.29    kleink #define	FP_NORMAL	0x02
     98      1.29    kleink #define	FP_SUBNORMAL	0x03
     99      1.29    kleink #define	FP_ZERO		0x04
    100      1.29    kleink /* NetBSD extensions */
    101      1.29    kleink #define	_FP_LOMD	0x80		/* range for machine-specific classes */
    102      1.29    kleink #define	_FP_HIMD	0xff
    103      1.29    kleink 
    104      1.27    kleink #endif /* !_ANSI_SOURCE && ... */
    105       1.1       cgd 
    106       1.6       jtc /*
    107       1.6       jtc  * XOPEN/SVID
    108       1.6       jtc  */
    109      1.25     bjh21 #if defined(_XOPEN_SOURCE) || defined(_NETBSD_SOURCE)
    110       1.1       cgd #define	M_E		2.7182818284590452354	/* e */
    111       1.1       cgd #define	M_LOG2E		1.4426950408889634074	/* log 2e */
    112       1.1       cgd #define	M_LOG10E	0.43429448190325182765	/* log 10e */
    113       1.1       cgd #define	M_LN2		0.69314718055994530942	/* log e2 */
    114       1.1       cgd #define	M_LN10		2.30258509299404568402	/* log e10 */
    115       1.1       cgd #define	M_PI		3.14159265358979323846	/* pi */
    116       1.1       cgd #define	M_PI_2		1.57079632679489661923	/* pi/2 */
    117       1.1       cgd #define	M_PI_4		0.78539816339744830962	/* pi/4 */
    118       1.1       cgd #define	M_1_PI		0.31830988618379067154	/* 1/pi */
    119       1.1       cgd #define	M_2_PI		0.63661977236758134308	/* 2/pi */
    120       1.1       cgd #define	M_2_SQRTPI	1.12837916709551257390	/* 2/sqrt(pi) */
    121       1.1       cgd #define	M_SQRT2		1.41421356237309504880	/* sqrt(2) */
    122       1.1       cgd #define	M_SQRT1_2	0.70710678118654752440	/* 1/sqrt(2) */
    123       1.6       jtc 
    124       1.6       jtc #define	MAXFLOAT	((float)3.40282346638528860e+38)
    125       1.6       jtc extern int signgam;
    126      1.25     bjh21 #endif /* _XOPEN_SOURCE || _NETBSD_SOURCE */
    127       1.6       jtc 
    128      1.25     bjh21 #if defined(_NETBSD_SOURCE)
    129       1.6       jtc enum fdversion {fdlibm_ieee = -1, fdlibm_svid, fdlibm_xopen, fdlibm_posix};
    130       1.6       jtc 
    131       1.6       jtc #define _LIB_VERSION_TYPE enum fdversion
    132       1.6       jtc #define _LIB_VERSION _fdlib_version
    133       1.6       jtc 
    134       1.6       jtc /* if global variable _LIB_VERSION is not desirable, one may
    135       1.6       jtc  * change the following to be a constant by:
    136       1.6       jtc  *	#define _LIB_VERSION_TYPE const enum version
    137       1.6       jtc  * In that case, after one initializes the value _LIB_VERSION (see
    138       1.6       jtc  * s_lib_version.c) during compile time, it cannot be modified
    139       1.6       jtc  * in the middle of a program
    140       1.6       jtc  */
    141       1.6       jtc extern  _LIB_VERSION_TYPE  _LIB_VERSION;
    142       1.6       jtc 
    143       1.6       jtc #define _IEEE_  fdlibm_ieee
    144       1.6       jtc #define _SVID_  fdlibm_svid
    145       1.6       jtc #define _XOPEN_ fdlibm_xopen
    146       1.6       jtc #define _POSIX_ fdlibm_posix
    147       1.6       jtc 
    148      1.11        tv #ifndef __cplusplus
    149       1.6       jtc struct exception {
    150       1.6       jtc 	int type;
    151       1.6       jtc 	char *name;
    152       1.6       jtc 	double arg1;
    153       1.6       jtc 	double arg2;
    154       1.6       jtc 	double retval;
    155       1.6       jtc };
    156      1.11        tv #endif
    157       1.6       jtc 
    158       1.6       jtc #define	HUGE		MAXFLOAT
    159       1.6       jtc 
    160       1.6       jtc /*
    161       1.6       jtc  * set X_TLOSS = pi*2**52, which is possibly defined in <values.h>
    162       1.6       jtc  * (one may replace the following line by "#include <values.h>")
    163       1.6       jtc  */
    164       1.6       jtc 
    165       1.6       jtc #define X_TLOSS		1.41484755040568800000e+16
    166       1.6       jtc 
    167       1.6       jtc #define	DOMAIN		1
    168       1.6       jtc #define	SING		2
    169       1.6       jtc #define	OVERFLOW	3
    170       1.6       jtc #define	UNDERFLOW	4
    171       1.6       jtc #define	TLOSS		5
    172       1.6       jtc #define	PLOSS		6
    173       1.6       jtc 
    174      1.25     bjh21 #endif /* _NETBSD_SOURCE */
    175       1.6       jtc 
    176       1.1       cgd __BEGIN_DECLS
    177       1.6       jtc /*
    178       1.6       jtc  * ANSI/POSIX
    179       1.6       jtc  */
    180      1.22    simonb double	acos __P((double));
    181      1.22    simonb double	asin __P((double));
    182      1.22    simonb double	atan __P((double));
    183      1.22    simonb double	atan2 __P((double, double));
    184      1.22    simonb double	cos __P((double));
    185      1.22    simonb double	sin __P((double));
    186      1.22    simonb double	tan __P((double));
    187      1.22    simonb 
    188      1.22    simonb double	cosh __P((double));
    189      1.22    simonb double	sinh __P((double));
    190      1.22    simonb double	tanh __P((double));
    191      1.22    simonb 
    192      1.22    simonb double	exp __P((double));
    193      1.22    simonb double	frexp __P((double, int *));
    194      1.22    simonb double	ldexp __P((double, int));
    195      1.22    simonb double	log __P((double));
    196      1.22    simonb double	log10 __P((double));
    197      1.22    simonb double	modf __P((double, double *));
    198      1.22    simonb 
    199      1.22    simonb double	pow __P((double, double));
    200      1.22    simonb double	sqrt __P((double));
    201      1.22    simonb 
    202      1.22    simonb double	ceil __P((double));
    203      1.22    simonb double	fabs __P((double));
    204      1.22    simonb double	floor __P((double));
    205      1.22    simonb double	fmod __P((double, double));
    206       1.1       cgd 
    207      1.25     bjh21 #if defined(_XOPEN_SOURCE) || defined(_NETBSD_SOURCE)
    208      1.22    simonb double	erf __P((double));
    209      1.22    simonb double	erfc __P((double));
    210      1.22    simonb double	gamma __P((double));
    211      1.22    simonb double	hypot __P((double, double));
    212      1.22    simonb int	finite __P((double));
    213      1.22    simonb double	j0 __P((double));
    214      1.22    simonb double	j1 __P((double));
    215      1.22    simonb double	jn __P((int, double));
    216      1.22    simonb double	lgamma __P((double));
    217      1.22    simonb double	y0 __P((double));
    218      1.22    simonb double	y1 __P((double));
    219      1.22    simonb double	yn __P((int, double));
    220       1.6       jtc 
    221      1.25     bjh21 #if (_XOPEN_SOURCE - 0) >= 500 || defined(_NETBSD_SOURCE)
    222      1.22    simonb double	acosh __P((double));
    223      1.22    simonb double	asinh __P((double));
    224      1.22    simonb double	atanh __P((double));
    225      1.22    simonb double	cbrt __P((double));
    226      1.22    simonb double	expm1 __P((double));
    227      1.22    simonb int	ilogb __P((double));
    228      1.22    simonb double	log1p __P((double));
    229      1.22    simonb double	logb __P((double));
    230      1.22    simonb double	nextafter __P((double, double));
    231      1.22    simonb double	remainder __P((double, double));
    232      1.22    simonb double	rint __P((double));
    233      1.22    simonb double	scalb __P((double, double));
    234      1.25     bjh21 #endif /* (_XOPEN_SOURCE - 0) >= 500 || defined(_NETBSD_SOURCE)*/
    235      1.25     bjh21 #endif /* _XOPEN_SOURCE || _NETBSD_SOURCE */
    236       1.6       jtc 
    237      1.29    kleink /*
    238      1.29    kleink  * ISO C99
    239      1.29    kleink  */
    240      1.29    kleink #if !defined(_ANSI_SOURCE) && !defined(_POSIX_C_SOURCE) && \
    241      1.29    kleink     !defined(_XOPEN_SOURCE) || \
    242      1.29    kleink     ((__STDC_VERSION__ - 0) >= 199901L) || \
    243      1.29    kleink     ((_POSIX_C_SOURCE - 0) >= 200112L) || \
    244      1.29    kleink     ((_XOPEN_SOURCE  - 0) >= 600) || \
    245      1.29    kleink     defined(_ISOC99_SOURCE) || defined(_NETBSD_SOURCE)
    246      1.29    kleink /* 7.12.3.1 int fpclassify(real-floating x) */
    247      1.29    kleink #define	fpclassify(__x)	__fpmacro_unary_floating(fpclassify, __x)
    248      1.29    kleink 
    249      1.29    kleink /* 7.12.3.2 int isfinite(real-floating x) */
    250      1.29    kleink #define	isfinite(__x)	__fpmacro_unary_floating(isfinite, __x)
    251      1.29    kleink 
    252      1.29    kleink /* 7.12.3.5 int isnormal(real-floating x) */
    253      1.29    kleink #define	isnormal(__x)	(fpclassify(__x) == FP_NORMAL)
    254      1.29    kleink 
    255      1.29    kleink /* 7.12.3.6 int signbit(real-floating x) */
    256      1.29    kleink #define	signbit(__x)	__fpmacro_unary_floating(signbit, __x)
    257      1.29    kleink 
    258  1.34.2.2        he double	round __P((double));
    259  1.34.2.2        he float	roundf __P((float));
    260  1.34.2.2        he 
    261      1.29    kleink #endif /* !_ANSI_SOURCE && ... */
    262      1.29    kleink 
    263      1.34    kleink #if !defined(_ANSI_SOURCE) && !defined(_POSIX_C_SOURCE) || \
    264      1.34    kleink     !defined(_XOPEN_SOURCE) || \
    265      1.34    kleink     ((__STDC_VERSION__ - 0) >= 199901L) || \
    266      1.34    kleink     ((_POSIX_C_SOURCE - 0) >= 200112L) || \
    267      1.34    kleink     defined(_ISOC99_SOURCE) || defined(_NETBSD_SOURCE)
    268      1.34    kleink /* 7.12.3.3 int isinf(real-floating x) */
    269      1.34    kleink #ifdef __isinf
    270      1.34    kleink #define	isinf(__x)	__isinf(__x)
    271      1.34    kleink #else
    272      1.34    kleink #define	isinf(__x)	__fpmacro_unary_floating(isinf, __x)
    273      1.34    kleink #endif
    274      1.34    kleink 
    275      1.34    kleink /* 7.12.3.4 int isnan(real-floating x) */
    276      1.34    kleink #ifdef __isnan
    277      1.34    kleink #define	isnan(__x)	__isnan(__x)
    278      1.34    kleink #else
    279      1.34    kleink #define	isnan(__x)	__fpmacro_unary_floating(isnan, __x)
    280      1.34    kleink #endif
    281      1.34    kleink #endif /* !_ANSI_SOURCE && ... */
    282      1.34    kleink 
    283      1.25     bjh21 #if defined(_NETBSD_SOURCE)
    284      1.11        tv #ifndef __cplusplus
    285      1.22    simonb int	matherr __P((struct exception *));
    286      1.11        tv #endif
    287       1.6       jtc 
    288       1.6       jtc /*
    289       1.6       jtc  * IEEE Test Vector
    290       1.6       jtc  */
    291      1.22    simonb double	significand __P((double));
    292       1.1       cgd 
    293       1.6       jtc /*
    294       1.6       jtc  * Functions callable from C, intended to support IEEE arithmetic.
    295       1.6       jtc  */
    296      1.22    simonb double	copysign __P((double, double));
    297      1.22    simonb double	scalbn __P((double, int));
    298       1.6       jtc 
    299       1.6       jtc /*
    300       1.6       jtc  * BSD math library entry points
    301       1.6       jtc  */
    302      1.23  christos #ifndef __MATH_PRIVATE__
    303      1.22    simonb double	cabs __P((/* struct complex { double r; double i; } */));
    304      1.23  christos #endif
    305      1.22    simonb double	drem __P((double, double));
    306       1.6       jtc 
    307      1.25     bjh21 #endif /* _NETBSD_SOURCE */
    308      1.12    kleink 
    309      1.25     bjh21 #if defined(_NETBSD_SOURCE) || defined(_REENTRANT)
    310       1.6       jtc /*
    311       1.6       jtc  * Reentrant version of gamma & lgamma; passes signgam back by reference
    312       1.6       jtc  * as the second argument; user must allocate space for signgam.
    313       1.6       jtc  */
    314      1.22    simonb double	gamma_r __P((double, int *));
    315      1.22    simonb double	lgamma_r __P((double, int *));
    316      1.25     bjh21 #endif /* _NETBSD_SOURCE || _REENTRANT */
    317       1.9       jtc 
    318       1.9       jtc 
    319      1.25     bjh21 #if defined(_NETBSD_SOURCE)
    320      1.15    kleink 
    321       1.9       jtc /* float versions of ANSI/POSIX functions */
    322      1.22    simonb float	acosf __P((float));
    323      1.22    simonb float	asinf __P((float));
    324      1.22    simonb float	atanf __P((float));
    325      1.22    simonb float	atan2f __P((float, float));
    326      1.22    simonb float	cosf __P((float));
    327      1.22    simonb float	sinf __P((float));
    328      1.22    simonb float	tanf __P((float));
    329      1.22    simonb 
    330      1.22    simonb float	coshf __P((float));
    331      1.22    simonb float	sinhf __P((float));
    332      1.22    simonb float	tanhf __P((float));
    333      1.22    simonb 
    334      1.22    simonb float	expf __P((float));
    335      1.22    simonb float	frexpf __P((float, int *));
    336      1.22    simonb float	ldexpf __P((float, int));
    337      1.22    simonb float	logf __P((float));
    338      1.22    simonb float	log10f __P((float));
    339      1.22    simonb float	modff __P((float, float *));
    340      1.22    simonb 
    341      1.22    simonb float	powf __P((float, float));
    342      1.22    simonb float	sqrtf __P((float));
    343      1.22    simonb 
    344      1.22    simonb float	ceilf __P((float));
    345      1.22    simonb float	fabsf __P((float));
    346      1.22    simonb float	floorf __P((float));
    347      1.22    simonb float	fmodf __P((float, float));
    348      1.22    simonb 
    349      1.22    simonb float	erff __P((float));
    350      1.22    simonb float	erfcf __P((float));
    351      1.22    simonb float	gammaf __P((float));
    352      1.22    simonb float	hypotf __P((float, float));
    353      1.22    simonb int	isinff __P((float));
    354      1.22    simonb int	isnanf __P((float));
    355      1.22    simonb int	finitef __P((float));
    356      1.22    simonb float	j0f __P((float));
    357      1.22    simonb float	j1f __P((float));
    358      1.22    simonb float	jnf __P((int, float));
    359      1.22    simonb float	lgammaf __P((float));
    360      1.22    simonb float	y0f __P((float));
    361      1.22    simonb float	y1f __P((float));
    362      1.22    simonb float	ynf __P((int, float));
    363      1.22    simonb 
    364      1.22    simonb float	acoshf __P((float));
    365      1.22    simonb float	asinhf __P((float));
    366      1.22    simonb float	atanhf __P((float));
    367      1.22    simonb float	cbrtf __P((float));
    368      1.22    simonb float	logbf __P((float));
    369      1.22    simonb float	nextafterf __P((float, float));
    370      1.22    simonb float	remainderf __P((float, float));
    371      1.22    simonb float	scalbf __P((float, float));
    372       1.9       jtc 
    373       1.9       jtc /*
    374       1.9       jtc  * float version of IEEE Test Vector
    375       1.9       jtc  */
    376      1.22    simonb float	significandf __P((float));
    377       1.9       jtc 
    378       1.9       jtc /*
    379       1.9       jtc  * Float versions of functions callable from C, intended to support
    380       1.9       jtc  * IEEE arithmetic.
    381       1.9       jtc  */
    382      1.22    simonb float	copysignf __P((float, float));
    383      1.22    simonb int	ilogbf __P((float));
    384      1.22    simonb float	rintf __P((float));
    385      1.22    simonb float	scalbnf __P((float, int));
    386       1.9       jtc 
    387       1.9       jtc /*
    388       1.9       jtc  * float versions of BSD math library entry points
    389       1.9       jtc  */
    390      1.23  christos #ifndef __MATH_PRIVATE__
    391      1.22    simonb float	cabsf __P((/* struct complex { float r; float i; } */));
    392      1.23  christos #endif
    393      1.22    simonb float	dremf __P((float, float));
    394      1.22    simonb float	expm1f __P((float));
    395      1.22    simonb float	log1pf __P((float));
    396      1.25     bjh21 #endif /* _NETBSD_SOURCE */
    397       1.9       jtc 
    398      1.25     bjh21 #if defined(_NETBSD_SOURCE) || defined(_REENTRANT)
    399       1.9       jtc /*
    400       1.9       jtc  * Float versions of reentrant version of gamma & lgamma; passes
    401       1.9       jtc  * signgam back by reference as the second argument; user must
    402       1.9       jtc  * allocate space for signgam.
    403       1.9       jtc  */
    404      1.22    simonb float	gammaf_r __P((float, int *));
    405      1.22    simonb float	lgammaf_r __P((float, int *));
    406      1.12    kleink #endif /* !... || _REENTRANT */
    407       1.9       jtc 
    408      1.29    kleink /*
    409      1.29    kleink  * Library implementation
    410      1.29    kleink  */
    411      1.29    kleink int	__fpclassifyf __P((float));
    412      1.29    kleink int	__fpclassifyd __P((double));
    413      1.29    kleink int	__isfinitef __P((float));
    414      1.29    kleink int	__isfinited __P((double));
    415      1.34    kleink int	__isinff __P((float));
    416      1.34    kleink int	__isinfd __P((double));
    417      1.34    kleink int	__isnanf __P((float));
    418      1.34    kleink int	__isnand __P((double));
    419      1.29    kleink int	__signbitf __P((float));
    420      1.29    kleink int	__signbitd __P((double));
    421      1.29    kleink 
    422      1.29    kleink #ifdef __HAVE_LONG_DOUBLE
    423      1.29    kleink int	__fpclassifyl __P((long double));
    424      1.29    kleink int	__isfinitel __P((long double));
    425      1.34    kleink int	__isinfl __P((long double));
    426      1.34    kleink int	__isnanl __P((long double));
    427      1.29    kleink int	__signbitl __P((long double));
    428      1.29    kleink #endif
    429       1.1       cgd __END_DECLS
    430       1.1       cgd 
    431       1.1       cgd #endif /* _MATH_H_ */
    432