math.h revision 130264
12116Sjkh/*
22116Sjkh * ====================================================
32116Sjkh * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
42116Sjkh *
52116Sjkh * Developed at SunPro, a Sun Microsystems, Inc. business.
62116Sjkh * Permission to use, copy, modify, and distribute this
78870Srgrimes * software is freely granted, provided that this notice
82116Sjkh * is preserved.
92116Sjkh * ====================================================
102116Sjkh */
112116Sjkh
122116Sjkh/*
132116Sjkh * from: @(#)fdlibm.h 5.1 93/09/24
1450476Speter * $FreeBSD: head/lib/msun/src/math.h 130264 2004-06-09 10:32:05Z das $
152116Sjkh */
162116Sjkh
172116Sjkh#ifndef _MATH_H_
1887805Sphantom#define	_MATH_H_
192116Sjkh
20130264Sdas#include <sys/cdefs.h>
21110566Smike#include <sys/_types.h>
22110566Smike
232116Sjkh/*
242116Sjkh * ANSI/POSIX
252116Sjkh */
26106268Sarchieextern const union __infinity_un {
27106268Sarchie	unsigned char	__uc[8];
28106268Sarchie	double		__ud;
29106268Sarchie} __infinity;
30110566Smike
31110566Smikeextern const union __nan_un {
32110566Smike	unsigned char	__uc[sizeof(float)];
33110566Smike	float		__uf;
34110566Smike} __nan;
35110566Smike
36128628Sdas#define	HUGE_VAL	(__infinity.__ud)
37128628Sdas
38128628Sdas#if __ISO_C_VISIBLE >= 1999
39110566Smike#define	FP_ILOGB0	(-0x7fffffff - 1)	/* INT_MIN */
40110566Smike#define	FP_ILOGBNAN	0x7fffffff		/* INT_MAX */
41110566Smike#define	HUGE_VALF	(float)HUGE_VAL
42110566Smike#define	HUGE_VALL	(long double)HUGE_VAL
43110566Smike#define	INFINITY	HUGE_VALF
44110566Smike#define	NAN		(__nan.__uf)
452116Sjkh
46126871Sbde#define	MATH_ERRNO	1
47126871Sbde#define	MATH_ERREXCEPT	2
48126871Sbde#define	math_errhandling	0
49126871Sbde
50110566Smike/* Symbolic constants to classify floating point numbers. */
51110769Smike#define	FP_INFINITE	0x01
52110769Smike#define	FP_NAN		0x02
53110769Smike#define	FP_NORMAL	0x04
54110769Smike#define	FP_SUBNORMAL	0x08
55110769Smike#define	FP_ZERO		0x10
56110566Smike#define	fpclassify(x) \
57110566Smike    ((sizeof (x) == sizeof (float)) ? __fpclassifyf(x) \
58110566Smike    : (sizeof (x) == sizeof (double)) ? __fpclassifyd(x) \
59110566Smike    : __fpclassifyl(x))
60110769Smike
61113077Sdas#define	isfinite(x)	((fpclassify(x) & (FP_INFINITE|FP_NAN)) == 0)
62110769Smike#define	isinf(x)	(fpclassify(x) == FP_INFINITE)
63110769Smike#define	isnan(x)	(fpclassify(x) == FP_NAN)
64110769Smike#define	isnormal(x)	(fpclassify(x) == FP_NORMAL)
65110769Smike
66110769Smike#define	isgreater(x, y)		(!isunordered((x), (y)) && (x) > (y))
67110769Smike#define	isgreaterequal(x, y)	(!isunordered((x), (y)) && (x) >= (y))
68110769Smike#define	isless(x, y)		(!isunordered((x), (y)) && (x) < (y))
69110769Smike#define	islessequal(x, y)	(!isunordered((x), (y)) && (x) <= (y))
70110769Smike#define	islessgreater(x, y)	(!isunordered((x), (y)) && \
71110769Smike					((x) > (y) || (y) > (x)))
72110769Smike#define	isunordered(x, y)	(isnan(x) || isnan(y))
73110769Smike
74110734Smike#define	signbit(x)	__signbit(x)
75110566Smike
76110566Smiketypedef	__double_t	double_t;
77110566Smiketypedef	__float_t	float_t;
78128628Sdas#endif /* __ISO_C_VISIBLE >= 1999 */
79110566Smike
802116Sjkh/*
812116Sjkh * XOPEN/SVID
822116Sjkh */
83128628Sdas#if __BSD_VISIBLE || __XSI_VISIBLE
842116Sjkh#define	M_E		2.7182818284590452354	/* e */
852116Sjkh#define	M_LOG2E		1.4426950408889634074	/* log 2e */
862116Sjkh#define	M_LOG10E	0.43429448190325182765	/* log 10e */
872116Sjkh#define	M_LN2		0.69314718055994530942	/* log e2 */
882116Sjkh#define	M_LN10		2.30258509299404568402	/* log e10 */
892116Sjkh#define	M_PI		3.14159265358979323846	/* pi */
902116Sjkh#define	M_PI_2		1.57079632679489661923	/* pi/2 */
912116Sjkh#define	M_PI_4		0.78539816339744830962	/* pi/4 */
922116Sjkh#define	M_1_PI		0.31830988618379067154	/* 1/pi */
932116Sjkh#define	M_2_PI		0.63661977236758134308	/* 2/pi */
942116Sjkh#define	M_2_SQRTPI	1.12837916709551257390	/* 2/sqrt(pi) */
952116Sjkh#define	M_SQRT2		1.41421356237309504880	/* sqrt(2) */
962116Sjkh#define	M_SQRT1_2	0.70710678118654752440	/* 1/sqrt(2) */
972116Sjkh
982116Sjkh#define	MAXFLOAT	((float)3.40282346638528860e+38)
992116Sjkhextern int signgam;
100128628Sdas#endif /* __BSD_VISIBLE || __XSI_VISIBLE */
1012116Sjkh
102128628Sdas#if __BSD_VISIBLE
1032116Sjkhenum fdversion {fdlibm_ieee = -1, fdlibm_svid, fdlibm_xopen, fdlibm_posix};
1042116Sjkh
1052116Sjkh#define _LIB_VERSION_TYPE enum fdversion
1068870Srgrimes#define _LIB_VERSION _fdlib_version
1072116Sjkh
1088870Srgrimes/* if global variable _LIB_VERSION is not desirable, one may
1098870Srgrimes * change the following to be a constant by:
1102116Sjkh *	#define _LIB_VERSION_TYPE const enum version
1112116Sjkh * In that case, after one initializes the value _LIB_VERSION (see
1122116Sjkh * s_lib_version.c) during compile time, it cannot be modified
1132116Sjkh * in the middle of a program
1148870Srgrimes */
1152116Sjkhextern  _LIB_VERSION_TYPE  _LIB_VERSION;
1162116Sjkh
1172116Sjkh#define _IEEE_  fdlibm_ieee
1182116Sjkh#define _SVID_  fdlibm_svid
1192116Sjkh#define _XOPEN_ fdlibm_xopen
1202116Sjkh#define _POSIX_ fdlibm_posix
1212116Sjkh
12258647Sobrien/* We have a problem when using C++ since `exception' is a reserved
12358647Sobrien   name in C++.  */
12428971Sbde#ifndef __cplusplus
1252116Sjkhstruct exception {
1262116Sjkh	int type;
1272116Sjkh	char *name;
1282116Sjkh	double arg1;
1292116Sjkh	double arg2;
1302116Sjkh	double retval;
1312116Sjkh};
13228971Sbde#endif
1332116Sjkh
134128628Sdas#define	isnanf(x)      	isnan(x)
135128628Sdas
136104280Sbde#if 0
137104281Sbde/* Old value from 4.4BSD-Lite math.h; this is probably better. */
138104280Sbde#define	HUGE		HUGE_VAL
139104280Sbde#else
1402116Sjkh#define	HUGE		MAXFLOAT
141104280Sbde#endif
1422116Sjkh
143128627Sdas#define X_TLOSS		1.41484755040568800000e+16	/* pi*2**52 */
1442116Sjkh
1452116Sjkh#define	DOMAIN		1
1462116Sjkh#define	SING		2
1472116Sjkh#define	OVERFLOW	3
1482116Sjkh#define	UNDERFLOW	4
1492116Sjkh#define	TLOSS		5
1502116Sjkh#define	PLOSS		6
1512116Sjkh
152128628Sdas#endif /* __BSD_VISIBLE */
1532116Sjkh
154104280Sbde/*
155104280Sbde * Most of these functions have the side effect of setting errno, so they
156104280Sbde * are not declared as __pure2.  (XXX: this point needs to be revisited,
157104280Sbde * since C99 doesn't require the mistake of setting errno, and we mostly
158104280Sbde * don't set it anyway.  In C99, pragmas and functions for changing the
159104280Sbde * rounding mode affect the purity of these functions.)
160104280Sbde */
16193197Sbde__BEGIN_DECLS
1622116Sjkh/*
1632116Sjkh * ANSI/POSIX
1642116Sjkh */
165110769Smikeint	__fpclassifyd(double) __pure2;
166110769Smikeint	__fpclassifyf(float) __pure2;
167110769Smikeint	__fpclassifyl(long double) __pure2;
168110769Smikeint	__signbit(double) __pure2;
169110566Smike
17092917Sobriendouble	acos(double);
17192917Sobriendouble	asin(double);
17292917Sobriendouble	atan(double);
17392917Sobriendouble	atan2(double, double);
17492917Sobriendouble	cos(double);
17592917Sobriendouble	sin(double);
17692917Sobriendouble	tan(double);
1772116Sjkh
17892917Sobriendouble	cosh(double);
17992917Sobriendouble	sinh(double);
18092917Sobriendouble	tanh(double);
1812116Sjkh
18292917Sobriendouble	exp(double);
183104280Sbdedouble	frexp(double, int *);	/* fundamentally !__pure2 */
18492917Sobriendouble	ldexp(double, int);
18592917Sobriendouble	log(double);
18692917Sobriendouble	log10(double);
187104280Sbdedouble	modf(double, double *);	/* fundamentally !__pure2 */
1882116Sjkh
18992917Sobriendouble	pow(double, double);
19092917Sobriendouble	sqrt(double);
1912116Sjkh
19292917Sobriendouble	ceil(double);
19392917Sobriendouble	fabs(double);
19492917Sobriendouble	floor(double);
19592917Sobriendouble	fmod(double, double);
1962116Sjkh
197104280Sbde/*
198104280Sbde * These functions are not in C90 so they can be "right".  The ones that
199104280Sbde * never set errno in lib/msun are declared as __pure2.
200104280Sbde */
201128628Sdas#if __BSD_VISIBLE || __ISO_C_VISIBLE >= 1999 || __XSI_VISIBLE
202128628Sdasdouble	acosh(double);
203128628Sdasdouble	asinh(double);
204128628Sdasdouble	atanh(double);
205128628Sdasdouble	cbrt(double) __pure2;
20692917Sobriendouble	erf(double);
207104280Sbdedouble	erfc(double) __pure2;
208128628Sdasdouble	expm1(double) __pure2;
20992917Sobriendouble	hypot(double, double);
210128628Sdasint	ilogb(double);
211128628Sdasdouble	lgamma(double);
212128628Sdasdouble	log1p(double) __pure2;
213128628Sdasdouble	logb(double) __pure2;
214128628Sdasdouble	nextafter(double, double);
215128628Sdasdouble	remainder(double, double);
216128628Sdasdouble	rint(double) __pure2;
217130179Sdasdouble	round(double);
218128628Sdas#endif /* __BSD_VISIBLE || __ISO_C_VISIBLE >= 1999 || __XSI_VISIBLE */
219128628Sdas
220128628Sdas#if __BSD_VISIBLE || __XSI_VISIBLE
22192917Sobriendouble	j0(double);
22292917Sobriendouble	j1(double);
22392917Sobriendouble	jn(int, double);
224128628Sdasdouble	scalb(double, double);
22592917Sobriendouble	y0(double);
22692917Sobriendouble	y1(double);
22792917Sobriendouble	yn(int, double);
2282116Sjkh
229128628Sdas#if __XSI_VISIBLE <= 500 || __BSD_VISIBLE
230128628Sdasdouble	gamma(double);
23128971Sbde#endif
232128628Sdas#endif /* __BSD_VISIBLE || __XSI_VISIBLE */
2332116Sjkh
234128628Sdas#if __BSD_VISIBLE || __ISO_C_VISIBLE >= 1999
235104280Sbdedouble	copysign(double, double) __pure2;
23692917Sobriendouble	scalbn(double, int);
237128628Sdasdouble	tgamma(double);
238128628Sdas#endif
2392116Sjkh
2402116Sjkh/*
2412116Sjkh * BSD math library entry points
2422116Sjkh */
243128628Sdas#if __BSD_VISIBLE
24492917Sobriendouble	drem(double, double);
245128628Sdasint	finite(double) __pure2;
2462116Sjkh
2472116Sjkh/*
2482116Sjkh * Reentrant version of gamma & lgamma; passes signgam back by reference
2492116Sjkh * as the second argument; user must allocate space for signgam.
2502116Sjkh */
25192917Sobriendouble	gamma_r(double, int *);
25292917Sobriendouble	lgamma_r(double, int *);
253128628Sdas
254128628Sdas/*
255128628Sdas * IEEE Test Vector
256128628Sdas */
257128628Sdasdouble	significand(double);
258128628Sdas
259128628Sdas#ifndef __cplusplus
260128628Sdasint	matherr(struct exception *);
261128628Sdas#endif
262111546Simp#endif /* __BSD_VISIBLE */
2632116Sjkh
2642116Sjkh/* float versions of ANSI/POSIX functions */
265128628Sdas#if __ISO_C_VISIBLE >= 1999
26692917Sobrienfloat	acosf(float);
26792917Sobrienfloat	asinf(float);
26892917Sobrienfloat	atanf(float);
26992917Sobrienfloat	atan2f(float, float);
27092917Sobrienfloat	cosf(float);
27192917Sobrienfloat	sinf(float);
27292917Sobrienfloat	tanf(float);
2732116Sjkh
27492917Sobrienfloat	coshf(float);
27592917Sobrienfloat	sinhf(float);
27692917Sobrienfloat	tanhf(float);
2772116Sjkh
27892917Sobrienfloat	expf(float);
279128628Sdasfloat	expm1f(float) __pure2;
280104280Sbdefloat	frexpf(float, int *);	/* fundamentally !__pure2 */
281128628Sdasint	ilogbf(float);
28292917Sobrienfloat	ldexpf(float, int);
283128628Sdasfloat	log10f(float);
284128628Sdasfloat	log1pf(float) __pure2;
28592917Sobrienfloat	logf(float);
286104280Sbdefloat	modff(float, float *);	/* fundamentally !__pure2 */
2872116Sjkh
28892917Sobrienfloat	powf(float, float);
28992917Sobrienfloat	sqrtf(float);
2902116Sjkh
29192917Sobrienfloat	ceilf(float);
29292917Sobrienfloat	fabsf(float);
29392917Sobrienfloat	floorf(float);
29492917Sobrienfloat	fmodf(float, float);
295130179Sdasfloat	roundf(float);
2962116Sjkh
29792917Sobrienfloat	erff(float);
298104280Sbdefloat	erfcf(float) __pure2;
299104280Sbdefloat	hypotf(float, float) __pure2;
30092917Sobrienfloat	lgammaf(float);
3012116Sjkh
30292917Sobrienfloat	acoshf(float);
30392917Sobrienfloat	asinhf(float);
30492917Sobrienfloat	atanhf(float);
305104280Sbdefloat	cbrtf(float) __pure2;
306104280Sbdefloat	logbf(float) __pure2;
307128628Sdasfloat	copysignf(float, float) __pure2;
30892917Sobrienfloat	nextafterf(float, float);
30992917Sobrienfloat	remainderf(float, float);
31092917Sobrienfloat	rintf(float);
31192917Sobrienfloat	scalbnf(float, int);
312128628Sdas#endif
3132116Sjkh
3142116Sjkh/*
3152116Sjkh * float versions of BSD math library entry points
3162116Sjkh */
317128628Sdas#if __BSD_VISIBLE
31892917Sobrienfloat	dremf(float, float);
319128628Sdasint	finitef(float) __pure2;
320128628Sdasfloat	gammaf(float);
321128628Sdasfloat	j0f(float);
322128628Sdasfloat	j1f(float);
323128628Sdasfloat	jnf(int, float);
324128628Sdasfloat	scalbf(float, float);
325128628Sdasfloat	y0f(float);
326128628Sdasfloat	y1f(float);
327128628Sdasfloat	ynf(int, float);
3282116Sjkh
3292116Sjkh/*
3302116Sjkh * Float versions of reentrant version of gamma & lgamma; passes
3312116Sjkh * signgam back by reference as the second argument; user must
3322116Sjkh * allocate space for signgam.
3332116Sjkh */
33492917Sobrienfloat	gammaf_r(float, int *);
33592917Sobrienfloat	lgammaf_r(float, int *);
336128628Sdas
337128628Sdas/*
338128628Sdas * float version of IEEE Test Vector
339128628Sdas */
340128628Sdasfloat	significandf(float);
341111546Simp#endif	/* __BSD_VISIBLE */
3422116Sjkh
343121418Sdes/*
344121418Sdes * long double versions of ISO/POSIX math functions
345121418Sdes */
346128628Sdas#if __ISO_C_VISIBLE >= 1999
347121418Sdes#if 0
348121418Sdeslong double	acoshl(long double);
349121418Sdeslong double	acosl(long double);
350121418Sdeslong double	asinhl(long double);
351121418Sdeslong double	asinl(long double);
352121418Sdeslong double	atan2l(long double, long double);
353121418Sdeslong double	atanhl(long double);
354121418Sdeslong double	atanl(long double);
355121418Sdeslong double	cbrtl(long double);
356121418Sdeslong double	ceill(long double);
357129040Sstefanf#endif
358121418Sdeslong double	copysignl(long double, long double);
359129040Sstefanf#if 0
360121418Sdeslong double	coshl(long double);
361121418Sdeslong double	cosl(long double);
362121418Sdeslong double	erfcl(long double);
363121418Sdeslong double	erfl(long double);
364121418Sdeslong double	exp2l(long double);
365121418Sdeslong double	expl(long double);
366121418Sdeslong double	expm1l(long double);
367121418Sdes#endif
368121418Sdeslong double	fabsl(long double);
369121418Sdes#if 0
370121418Sdeslong double	fdiml(long double, long double);
371121418Sdeslong double	floorl(long double);
372121418Sdeslong double	fmal(long double, long double, long double);
373121418Sdeslong double	fmaxl(long double, long double);
374121418Sdeslong double	fminl(long double, long double);
375121418Sdeslong double	fmodl(long double, long double);
376121418Sdeslong double	frexpl(long double	value, int *);
377121418Sdeslong double	hypotl(long double, long double);
378121418Sdesint		ilogbl(long double);
379121418Sdeslong double	ldexpl(long double, int);
380121418Sdeslong double	lgammal(long double);
381121418Sdeslong long	llrintl(long double);
382121418Sdeslong long	llroundl(long double);
383121418Sdeslong double	log10l(long double);
384121418Sdeslong double	log1pl(long double);
385121418Sdeslong double	log2l(long double);
386121418Sdeslong double	logbl(long double);
387121418Sdeslong double	logl(long double);
388121418Sdeslong		lrintl(long double);
389121418Sdeslong		lroundl(long double);
390121418Sdeslong double	modfl(long double, long double	*);
391121418Sdeslong double	nanl(const char *);
392121418Sdeslong double	nearbyintl(long double);
393121418Sdeslong double	nextafterl(long double, long double);
394121418Sdesdouble		nexttoward(double, long double);
395121418Sdesfloat		nexttowardf(float, long double);
396121418Sdeslong double	nexttowardl(long double, long double);
397121418Sdeslong double	powl(long double, long double);
398121418Sdeslong double	remainderl(long double, long double);
399121418Sdeslong double	remquol(long double, long double, int *);
400121418Sdeslong double	rintl(long double);
401121418Sdeslong double	roundl(long double);
402121418Sdeslong double	scalblnl(long double, long);
403121418Sdeslong double	scalbnl(long double, int);
404121418Sdeslong double	sinhl(long double);
405121418Sdeslong double	sinl(long double);
406121418Sdeslong double	sqrtl(long double);
407121418Sdeslong double	tanhl(long double);
408121418Sdeslong double	tanl(long double);
409121418Sdeslong double	tgammal(long double);
410121418Sdeslong double	truncl(long double);
411121418Sdes#endif
412121418Sdes
413128628Sdas#endif /* __ISO_C_VISIBLE >= 1999 */
4142116Sjkh__END_DECLS
4152116Sjkh
41687805Sphantom#endif /* !_MATH_H_ */
417