source: trunk/src/emx/include/math.h@ 2013

Last change on this file since 2013 was 2013, checked in by bird, 20 years ago

o The smallcnv stuff is gone, waste of space since we're not really into

static linking. Should've done this when switching to gdtoa.

o Ported the msun and some other math bits from current FreeBSD libc.

This mostly replaces the EMX math, except for some double long variants
and some EMX specific ones. This is a risky change, but it's needed
if we're gonna catch up on the C99 bits and make libstdc++ happy.
There are some new headers, complex.h and fenv.h being the importan ones.
float.h have gotten some updates while math.h is totally replaced.
More than 100 standard functions were added!
NOTE: msun is using MATH_ERREXCEPT (math_errhandling) and not

MATH_ERRNO for error reporting.

I really hope this is not gonna uncover more OS/2 387 mess.

  • Property cvs2svn:cvs-rev set to 1.7
  • Property svn:eol-style set to native
  • Property svn:executable set to *
File size: 12.7 KB
Line 
1/*
2 * ====================================================
3 * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
4 *
5 * Developed at SunPro, a Sun Microsystems, Inc. business.
6 * Permission to use, copy, modify, and distribute this
7 * software is freely granted, provided that this notice
8 * is preserved.
9 * ====================================================
10 */
11
12/*
13 * from: @(#)fdlibm.h 5.1 93/09/24
14 * $FreeBSD: src/lib/msun/src/math.h,v 1.61 2005/04/16 21:12:47 das Exp $
15 */
16
17/** @file
18 * FreeBSD HEAD 2005-06-xx
19 */
20
21#ifndef _MATH_H_
22#define _MATH_H_
23
24#include <sys/cdefs.h>
25#include <sys/_types.h>
26#include <machine/_limits.h>
27
28/*
29 * ANSI/POSIX
30 */
31extern const union __infinity_un {
32 unsigned char __uc[8];
33 double __ud;
34} __infinity;
35
36extern const union __nan_un {
37 unsigned char __uc[sizeof(float)];
38 float __uf;
39} __nan;
40
41#if __GNUC_PREREQ__(3, 3) || (defined(__INTEL_COMPILER) && __INTEL_COMPILER >= 800)
42#define __MATH_BUILTIN_CONSTANTS
43#endif
44
45#if __GNUC_PREREQ__(3, 0) && !defined(__INTEL_COMPILER)
46#define __MATH_BUILTIN_RELOPS
47#endif
48
49#ifdef __MATH_BUILTIN_CONSTANTS
50#define HUGE_VAL __builtin_huge_val()
51#else
52#define HUGE_VAL (__infinity.__ud)
53#endif
54
55#if __ISO_C_VISIBLE >= 1999
56#define FP_ILOGB0 (-__INT_MAX)
57#define FP_ILOGBNAN __INT_MAX
58
59#ifdef __MATH_BUILTIN_CONSTANTS
60#define HUGE_VALF __builtin_huge_valf()
61#define HUGE_VALL __builtin_huge_vall()
62#define INFINITY __builtin_inf()
63#define NAN __builtin_nan("")
64#else
65#define HUGE_VALF (float)HUGE_VAL
66#define HUGE_VALL (long double)HUGE_VAL
67#define INFINITY HUGE_VALF
68#define NAN (__nan.__uf)
69#endif /* __MATH_BUILTIN_CONSTANTS */
70
71#define MATH_ERRNO 1
72#define MATH_ERREXCEPT 2
73#define math_errhandling MATH_ERREXCEPT
74
75/* XXX We need a <machine/math.h>. */
76#if defined(__ia64__) || defined(__sparc64__)
77#define FP_FAST_FMA
78#endif
79#ifdef __ia64__
80#define FP_FAST_FMAL
81#endif
82#define FP_FAST_FMAF
83
84/* Symbolic constants to classify floating point numbers. */
85#define FP_INFINITE 0x01
86#define FP_NAN 0x02
87#define FP_NORMAL 0x04
88#define FP_SUBNORMAL 0x08
89#define FP_ZERO 0x10
90#define fpclassify(x) \
91 ((sizeof (x) == sizeof (float)) ? __fpclassifyf(x) \
92 : (sizeof (x) == sizeof (double)) ? __fpclassifyd(x) \
93 : __fpclassifyl(x))
94
95#define isfinite(x) \
96 ((sizeof (x) == sizeof (float)) ? __isfinitef(x) \
97 : (sizeof (x) == sizeof (double)) ? __isfinite(x) \
98 : __isfinitel(x))
99#define isinf(x) \
100 ((sizeof (x) == sizeof (float)) ? __isinff(x) \
101 : (sizeof (x) == sizeof (double)) ? isinf(x) \
102 : __isinfl(x))
103#define isnan(x) \
104 ((sizeof (x) == sizeof (float)) ? isnanf(x) \
105 : (sizeof (x) == sizeof (double)) ? isnan(x) \
106 : __isnanl(x))
107#define isnormal(x) \
108 ((sizeof (x) == sizeof (float)) ? __isnormalf(x) \
109 : (sizeof (x) == sizeof (double)) ? __isnormal(x) \
110 : __isnormall(x))
111
112#ifdef __MATH_BUILTIN_RELOPS
113#define isgreater(x, y) __builtin_isgreater((x), (y))
114#define isgreaterequal(x, y) __builtin_isgreaterequal((x), (y))
115#define isless(x, y) __builtin_isless((x), (y))
116#define islessequal(x, y) __builtin_islessequal((x), (y))
117#define islessgreater(x, y) __builtin_islessgreater((x), (y))
118#define isunordered(x, y) __builtin_isunordered((x), (y))
119#else
120#define isgreater(x, y) (!isunordered((x), (y)) && (x) > (y))
121#define isgreaterequal(x, y) (!isunordered((x), (y)) && (x) >= (y))
122#define isless(x, y) (!isunordered((x), (y)) && (x) < (y))
123#define islessequal(x, y) (!isunordered((x), (y)) && (x) <= (y))
124#define islessgreater(x, y) (!isunordered((x), (y)) && \
125 ((x) > (y) || (y) > (x)))
126#define isunordered(x, y) (isnan(x) || isnan(y))
127#endif /* __MATH_BUILTIN_RELOPS */
128
129#define signbit(x) \
130 ((sizeof (x) == sizeof (float)) ? __signbitf(x) \
131 : (sizeof (x) == sizeof (double)) ? __signbit(x) \
132 : __signbitl(x))
133
134typedef __double_t double_t;
135typedef __float_t float_t;
136#endif /* __ISO_C_VISIBLE >= 1999 */
137
138/*
139 * XOPEN/SVID
140 */
141#if __BSD_VISIBLE || __XSI_VISIBLE
142#define M_E 2.7182818284590452354 /* e */
143#define M_LOG2E 1.4426950408889634074 /* log 2e */
144#define M_LOG10E 0.43429448190325182765 /* log 10e */
145#define M_LN2 0.69314718055994530942 /* log e2 */
146#define M_LN10 2.30258509299404568402 /* log e10 */
147#define M_PI 3.14159265358979323846 /* pi */
148#define M_PI_2 1.57079632679489661923 /* pi/2 */
149#define M_PI_4 0.78539816339744830962 /* pi/4 */
150#define M_1_PI 0.31830988618379067154 /* 1/pi */
151#define M_2_PI 0.63661977236758134308 /* 2/pi */
152#define M_2_SQRTPI 1.12837916709551257390 /* 2/sqrt(pi) */
153#define M_SQRT2 1.41421356237309504880 /* sqrt(2) */
154#define M_SQRT1_2 0.70710678118654752440 /* 1/sqrt(2) */
155
156#define MAXFLOAT ((float)3.40282346638528860e+38)
157extern int signgam;
158#endif /* __BSD_VISIBLE || __XSI_VISIBLE */
159
160#if __BSD_VISIBLE
161#if 0
162/* Old value from 4.4BSD-Lite math.h; this is probably better. */
163#define HUGE HUGE_VAL
164#else
165#define HUGE MAXFLOAT
166#endif
167#endif /* __BSD_VISIBLE */
168
169/*
170 * Most of these functions depend on the rounding mode and have the side
171 * effect of raising floating-point exceptions, so they are not declared
172 * as __pure2. In C99, FENV_ACCESS affects the purity of these functions.
173 */
174__BEGIN_DECLS
175/*
176 * ANSI/POSIX
177 */
178int __fpclassifyd(double) __pure2;
179int __fpclassifyf(float) __pure2;
180int __fpclassifyl(long double) __pure2;
181int __isfinitef(float) __pure2;
182int __isfinite(double) __pure2;
183int __isfinitel(long double) __pure2;
184int __isinff(float) __pure2;
185int __isinfl(long double) __pure2;
186int __isnanl(long double) __pure2;
187int __isnormalf(float) __pure2;
188int __isnormal(double) __pure2;
189int __isnormall(long double) __pure2;
190int __signbit(double) __pure2;
191int __signbitf(float) __pure2;
192int __signbitl(long double) __pure2;
193
194double acos(double);
195double asin(double);
196double atan(double);
197double atan2(double, double);
198double cos(double);
199double sin(double);
200double tan(double);
201
202double cosh(double);
203double sinh(double);
204double tanh(double);
205
206double exp(double);
207double frexp(double, int *); /* fundamentally !__pure2 */
208double ldexp(double, int);
209double log(double);
210double log10(double);
211double modf(double, double *); /* fundamentally !__pure2 */
212
213double pow(double, double);
214double sqrt(double);
215
216double ceil(double);
217double fabs(double) __pure2;
218double floor(double);
219double fmod(double, double);
220
221/*
222 * These functions are not in C90.
223 */
224#if __BSD_VISIBLE || __ISO_C_VISIBLE >= 1999 || __XSI_VISIBLE
225double acosh(double);
226double asinh(double);
227double atanh(double);
228double cbrt(double);
229double erf(double);
230double erfc(double);
231double exp2(double);
232double expm1(double);
233double fma(double, double, double);
234double hypot(double, double);
235int ilogb(double) __pure2;
236int (isinf)(double) __pure2;
237int (isnan)(double) __pure2;
238double lgamma(double);
239long long llrint(double);
240long long llround(double);
241double log1p(double);
242double logb(double);
243long lrint(double);
244long lround(double);
245double nextafter(double, double);
246double remainder(double, double);
247double remquo(double, double, int *);
248double rint(double);
249#endif /* __BSD_VISIBLE || __ISO_C_VISIBLE >= 1999 || __XSI_VISIBLE */
250
251#if __BSD_VISIBLE || __XSI_VISIBLE
252double j0(double);
253double j1(double);
254double jn(int, double);
255double scalb(double, double);
256double y0(double);
257double y1(double);
258double yn(int, double);
259
260#if __XSI_VISIBLE <= 500 || __BSD_VISIBLE
261double gamma(double);
262#endif
263#endif /* __BSD_VISIBLE || __XSI_VISIBLE */
264
265#if __BSD_VISIBLE || __ISO_C_VISIBLE >= 1999
266double copysign(double, double) __pure2;
267double fdim(double, double);
268double fmax(double, double) __pure2;
269double fmin(double, double) __pure2;
270double nearbyint(double);
271double round(double);
272double scalbln(double, long);
273double scalbn(double, int);
274double tgamma(double);
275double trunc(double);
276#endif
277
278/*
279 * BSD math library entry points
280 */
281#if __BSD_VISIBLE
282double drem(double, double);
283int finite(double) __pure2;
284int isnanf(float) __pure2;
285
286/*
287 * Reentrant version of gamma & lgamma; passes signgam back by reference
288 * as the second argument; user must allocate space for signgam.
289 */
290double gamma_r(double, int *);
291double lgamma_r(double, int *);
292
293/*
294 * IEEE Test Vector
295 */
296double significand(double);
297#endif /* __BSD_VISIBLE */
298
299/* float versions of ANSI/POSIX functions */
300#if __ISO_C_VISIBLE >= 1999
301float acosf(float);
302float asinf(float);
303float atanf(float);
304float atan2f(float, float);
305float cosf(float);
306float sinf(float);
307float tanf(float);
308
309float coshf(float);
310float sinhf(float);
311float tanhf(float);
312
313float exp2f(float);
314float expf(float);
315float expm1f(float);
316float frexpf(float, int *); /* fundamentally !__pure2 */
317int ilogbf(float) __pure2;
318float ldexpf(float, int);
319float log10f(float);
320float log1pf(float);
321float logf(float);
322float modff(float, float *); /* fundamentally !__pure2 */
323
324float powf(float, float);
325float sqrtf(float);
326
327float ceilf(float);
328float fabsf(float) __pure2;
329float floorf(float);
330float fmodf(float, float);
331float roundf(float);
332
333float erff(float);
334float erfcf(float);
335float hypotf(float, float);
336float lgammaf(float);
337
338float acoshf(float);
339float asinhf(float);
340float atanhf(float);
341float cbrtf(float);
342float logbf(float);
343float copysignf(float, float) __pure2;
344long long llrintf(float);
345long long llroundf(float);
346long lrintf(float);
347long lroundf(float);
348float nearbyintf(float);
349float nextafterf(float, float);
350float remainderf(float, float);
351float remquof(float, float, int *);
352float rintf(float);
353float scalblnf(float, long);
354float scalbnf(float, int);
355float truncf(float);
356
357float fdimf(float, float);
358float fmaf(float, float, float);
359float fmaxf(float, float) __pure2;
360float fminf(float, float) __pure2;
361#endif
362
363/*
364 * float versions of BSD math library entry points
365 */
366#if __BSD_VISIBLE
367float dremf(float, float);
368int finitef(float) __pure2;
369float gammaf(float);
370float j0f(float);
371float j1f(float);
372float jnf(int, float);
373float scalbf(float, float);
374float y0f(float);
375float y1f(float);
376float ynf(int, float);
377
378/*
379 * Float versions of reentrant version of gamma & lgamma; passes
380 * signgam back by reference as the second argument; user must
381 * allocate space for signgam.
382 */
383float gammaf_r(float, int *);
384float lgammaf_r(float, int *);
385
386/*
387 * float version of IEEE Test Vector
388 */
389float significandf(float);
390#endif /* __BSD_VISIBLE */
391
392/*
393 * long double versions of ISO/POSIX math functions
394 */
395#if __ISO_C_VISIBLE >= 1999
396#if 1 /* bird: we've got these */
397long double acoshl(long double);
398long double acosl(long double);
399long double asinhl(long double);
400long double asinl(long double);
401long double atan2l(long double, long double);
402long double atanhl(long double);
403long double atanl(long double);
404long double cbrtl(long double);
405#endif
406long double ceill(long double);
407long double copysignl(long double, long double) __pure2;
408#if 1 /* bird: we've got some of these */
409long double coshl(long double);
410long double cosl(long double);
411/*long double erfcl(long double);
412long double erfl(long double);
413long double exp2l(long double);*/
414long double expl(long double);
415/*long double expm1l(long double);*/
416#endif
417long double fabsl(long double) __pure2;
418long double fdiml(long double, long double);
419long double floorl(long double);
420long double fmal(long double, long double, long double);
421long double fmaxl(long double, long double) __pure2;
422long double fminl(long double, long double) __pure2;
423#if 1 /* bird: we've got this one */
424long double fmodl(long double, long double);
425#endif
426long double frexpl(long double value, int *); /* fundamentally !__pure2 */
427#if 1 /* bird: we've got this one */
428long double hypotl(long double, long double);
429#endif
430int ilogbl(long double) __pure2;
431long double ldexpl(long double, int);
432#if 0
433long double lgammal(long double);
434long long llrintl(long double);
435#endif
436long long llroundl(long double);
437#if 1 /* bird: we've got some of these */
438long double log10l(long double);
439/*long double log1pl(long double);
440long double log2l(long double);
441long double logbl(long double);*/
442long double logl(long double);
443/*long lrintl(long double);*/
444#endif
445long lroundl(long double);
446#if 1 /* bird: we've got some of these. */
447long double modfl(long double, long double *); /* fundamentally !__pure2 */
448/*long double nanl(const char *) __pure2;
449long double nearbyintl(long double);*/
450#endif
451long double nextafterl(long double, long double);
452double nexttoward(double, long double);
453float nexttowardf(float, long double);
454long double nexttowardl(long double, long double);
455#if 1 /* bird: we've got powl. */
456long double powl(long double, long double);
457/*long double remainderl(long double, long double);
458long double remquol(long double, long double, int *);*/
459long double rintl(long double);
460#endif
461long double roundl(long double);
462long double scalblnl(long double, long);
463long double scalbnl(long double, int);
464#if 1 /* birdL we 've got most of these. */
465long double sinhl(long double);
466long double sinl(long double);
467long double sqrtl(long double);
468long double tanhl(long double);
469long double tanl(long double);
470/*long double tgammal(long double); */
471#endif
472long double truncl(long double);
473
474#endif /* __ISO_C_VISIBLE >= 1999 */
475__END_DECLS
476
477#endif /* !_MATH_H_ */
Note: See TracBrowser for help on using the repository browser.