Subversion Repositories Kolibri OS

Rev

Rev 6099 | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
4349 Serge 1
#ifndef  _MATH_H_
2
 
3
#define  _MATH_H_
4
 
5
#include 
6536 serge 6
#include 
4349 Serge 7
#include 
8
#include "_ansi.h"
9
 
10
_BEGIN_STD_C
11
 
12
/* __dmath, __fmath, and __ldmath are only here for backwards compatibility
13
 * in case any code used them.  They are no longer used by Newlib, itself,
14
 * other than legacy.  */
15
union __dmath
16
{
17
  double d;
18
  __ULong i[2];
19
};
20
 
21
union __fmath
22
{
23
  float f;
24
  __ULong i[1];
25
};
26
 
27
#if defined(_HAVE_LONG_DOUBLE)
28
union __ldmath
29
{
30
  long double ld;
31
  __ULong i[4];
32
};
33
#endif
34
 
35
/* Natural log of 2 */
36
#define _M_LN2        0.693147180559945309417
37
 
4921 Serge 38
#if __GNUC_PREREQ (3, 3)
4349 Serge 39
 /* gcc >= 3.3 implicitly defines builtins for HUGE_VALx values.  */
40
 
41
# ifndef HUGE_VAL
42
#  define HUGE_VAL (__builtin_huge_val())
43
# endif
44
 
45
# ifndef HUGE_VALF
46
#  define HUGE_VALF (__builtin_huge_valf())
47
# endif
48
 
49
# ifndef HUGE_VALL
50
#  define HUGE_VALL (__builtin_huge_vall())
51
# endif
52
 
53
# ifndef INFINITY
54
#  define INFINITY (__builtin_inff())
55
# endif
56
 
57
# ifndef NAN
58
#  define NAN (__builtin_nanf(""))
59
# endif
60
 
61
#else /* !gcc >= 3.3  */
62
 
63
 /*      No builtins.  Use fixed defines instead.  (All 3 HUGE plus the INFINITY
64
  * and NAN macros are required to be constant expressions.  Using a variable--
65
  * even a static const--does not meet this requirement, as it cannot be
66
  * evaluated at translation time.)
67
  *      The infinities are done using numbers that are far in excess of
68
  * something that would be expected to be encountered in a floating-point
69
  * implementation.  (A more certain way uses values from float.h, but that is
70
  * avoided because system includes are not supposed to include each other.)
71
  *      This method might produce warnings from some compilers.  (It does in
72
  * newer GCCs, but not for ones that would hit this #else.)  If this happens,
73
  * please report details to the Newlib mailing list.  */
74
 
75
 #ifndef HUGE_VAL
76
  #define HUGE_VAL (1.0e999999999)
77
 #endif
78
 
79
 #ifndef HUGE_VALF
80
  #define HUGE_VALF (1.0e999999999F)
81
 #endif
82
 
83
 #if !defined(HUGE_VALL)  &&  defined(_HAVE_LONG_DOUBLE)
84
  #define HUGE_VALL (1.0e999999999L)
85
 #endif
86
 
87
 #if !defined(INFINITY)
88
  #define INFINITY (HUGE_VALF)
89
 #endif
90
 
91
 #if !defined(NAN)
92
  #if defined(__GNUC__)  &&  defined(__cplusplus)
93
    /* Exception:  older g++ versions warn about the divide by 0 used in the
94
     * normal case (even though older gccs do not).  This trick suppresses the
95
     * warning, but causes errors for plain gcc, so is only used in the one
96
     * special case.  */
97
    static const union { __ULong __i[1]; float __d; } __Nanf = {0x7FC00000};
98
    #define NAN (__Nanf.__d)
99
  #else
100
    #define NAN (0.0F/0.0F)
101
  #endif
102
 #endif
103
 
104
#endif /* !gcc >= 3.3  */
105
 
106
/* Reentrant ANSI C functions.  */
107
 
108
#ifndef __math_68881
109
extern double atan _PARAMS((double));
110
extern double cos _PARAMS((double));
111
extern double sin _PARAMS((double));
112
extern double tan _PARAMS((double));
113
extern double tanh _PARAMS((double));
114
extern double frexp _PARAMS((double, int *));
115
extern double modf _PARAMS((double, double *));
116
extern double ceil _PARAMS((double));
117
extern double fabs _PARAMS((double));
118
extern double floor _PARAMS((double));
119
#endif /* ! defined (__math_68881) */
120
 
121
/* Non reentrant ANSI C functions.  */
122
 
123
#ifndef _REENT_ONLY
124
#ifndef __math_68881
125
extern double acos _PARAMS((double));
126
extern double asin _PARAMS((double));
127
extern double atan2 _PARAMS((double, double));
128
extern double cosh _PARAMS((double));
129
extern double sinh _PARAMS((double));
130
extern double exp _PARAMS((double));
131
extern double ldexp _PARAMS((double, int));
132
extern double log _PARAMS((double));
133
extern double log10 _PARAMS((double));
134
extern double pow _PARAMS((double, double));
135
extern double sqrt _PARAMS((double));
136
extern double fmod _PARAMS((double, double));
137
#endif /* ! defined (__math_68881) */
138
#endif /* ! defined (_REENT_ONLY) */
139
 
6536 serge 140
#if __ISO_C_VISIBLE >= 1999
4349 Serge 141
/* ISO C99 types and macros. */
142
 
4921 Serge 143
/* FIXME:  FLT_EVAL_METHOD should somehow be gotten from float.h (which is hard,
144
 * considering that the standard says the includes it defines should not
145
 * include other includes that it defines) and that value used.  (This can be
146
 * solved, but autoconf has a bug which makes the solution more difficult, so
147
 * it has been skipped for now.)  */
148
#if !defined(FLT_EVAL_METHOD) && defined(__FLT_EVAL_METHOD__)
149
  #define FLT_EVAL_METHOD __FLT_EVAL_METHOD__
150
  #define __TMP_FLT_EVAL_METHOD
4349 Serge 151
#endif /* FLT_EVAL_METHOD */
4921 Serge 152
#if defined FLT_EVAL_METHOD
153
  #if FLT_EVAL_METHOD == 0
154
    typedef float  float_t;
155
    typedef double double_t;
156
   #elif FLT_EVAL_METHOD == 1
157
    typedef double float_t;
158
    typedef double double_t;
159
   #elif FLT_EVAL_METHOD == 2
160
    typedef long double float_t;
161
    typedef long double double_t;
162
   #else
163
    /* Implementation-defined.  Assume float_t and double_t have been
164
     * defined previously for this configuration (e.g. config.h). */
165
  #endif
166
#else
167
    /* Assume basic definitions.  */
168
    typedef float  float_t;
169
    typedef double double_t;
170
#endif
171
#if defined(__TMP_FLT_EVAL_METHOD)
172
  #undef FLT_EVAL_METHOD
173
#endif
4349 Serge 174
 
175
#define FP_NAN         0
176
#define FP_INFINITE    1
177
#define FP_ZERO        2
178
#define FP_SUBNORMAL   3
179
#define FP_NORMAL      4
180
 
181
#ifndef FP_ILOGB0
182
# define FP_ILOGB0 (-INT_MAX)
183
#endif
184
#ifndef FP_ILOGBNAN
185
# define FP_ILOGBNAN INT_MAX
186
#endif
187
 
188
#ifndef MATH_ERRNO
189
# define MATH_ERRNO 1
190
#endif
191
#ifndef MATH_ERREXCEPT
192
# define MATH_ERREXCEPT 2
193
#endif
194
#ifndef math_errhandling
195
# define math_errhandling MATH_ERRNO
196
#endif
197
 
198
extern int __isinff (float x);
199
extern int __isinfd (double x);
200
extern int __isnanf (float x);
201
extern int __isnand (double x);
202
extern int __fpclassifyf (float x);
203
extern int __fpclassifyd (double x);
204
extern int __signbitf (float x);
205
extern int __signbitd (double x);
206
 
207
/* Note: isinf and isnan were once functions in newlib that took double
208
 *       arguments.  C99 specifies that these names are reserved for macros
209
 *       supporting multiple floating point types.  Thus, they are
210
 *       now defined as macros.  Implementations of the old functions
211
 *       taking double arguments still exist for compatibility purposes
212
 *       (prototypes for them are in ).  */
213
 
6536 serge 214
#if __GNUC_PREREQ (4, 4)
215
  #define fpclassify(__x) (__builtin_fpclassify (FP_NAN, FP_INFINITE, \
216
						 FP_NORMAL, FP_SUBNORMAL, \
217
						 FP_ZERO, __x))
218
  #ifndef isfinite
219
    #define isfinite(__x)	(__builtin_isfinite (__x))
220
  #endif
221
  #ifndef isinf
222
    #define isinf(__x) (__builtin_isinf_sign (__x))
223
  #endif
224
  #ifndef isnan
225
    #define isnan(__x) (__builtin_isnan (__x))
226
  #endif
227
  #define isnormal(__x) (__builtin_isnormal (__x))
228
#else
229
  #define fpclassify(__x) \
230
	  ((sizeof(__x) == sizeof(float))  ? __fpclassifyf(__x) : \
231
	  __fpclassifyd(__x))
232
  #ifndef isfinite
233
    #define isfinite(__y) \
234
	    (__extension__ ({int __cy = fpclassify(__y); \
235
			     __cy != FP_INFINITE && __cy != FP_NAN;}))
236
  #endif
237
  #ifndef isinf
238
    #define isinf(__x) (fpclassify(__x) == FP_INFINITE)
239
  #endif
240
  #ifndef isnan
241
    #define isnan(__x) (fpclassify(__x) == FP_NAN)
242
  #endif
243
  #define isnormal(__x) (fpclassify(__x) == FP_NORMAL)
4349 Serge 244
#endif
245
 
6536 serge 246
#if __GNUC_PREREQ (4, 0)
247
  #if defined(_HAVE_LONG_DOUBLE)
248
    #define signbit(__x) \
249
	    ((sizeof(__x) == sizeof(float))  ? __builtin_signbitf(__x) : \
250
	     (sizeof(__x) == sizeof(double)) ? __builtin_signbit (__x) : \
251
					       __builtin_signbitl(__x))
252
  #else
253
    #define signbit(__x) \
254
	    ((sizeof(__x) == sizeof(float))  ? __builtin_signbitf(__x) : \
255
					       __builtin_signbit (__x))
256
  #endif
257
#else
258
  #define signbit(__x) \
4349 Serge 259
	((sizeof(__x) == sizeof(float))  ?  __signbitf(__x) : \
260
		__signbitd(__x))
6536 serge 261
#endif
4349 Serge 262
 
6536 serge 263
#if __GNUC_PREREQ (2, 97)
264
#define isgreater(__x,__y)	(__builtin_isgreater (__x, __y))
265
#define isgreaterequal(__x,__y)	(__builtin_isgreaterequal (__x, __y))
266
#define isless(__x,__y)		(__builtin_isless (__x, __y))
267
#define islessequal(__x,__y)	(__builtin_islessequal (__x, __y))
268
#define islessgreater(__x,__y)	(__builtin_islessgreater (__x, __y))
269
#define isunordered(__x,__y)	(__builtin_isunordered (__x, __y))
270
#else
4349 Serge 271
#define isgreater(x,y) \
272
          (__extension__ ({__typeof__(x) __x = (x); __typeof__(y) __y = (y); \
273
                           !isunordered(__x,__y) && (__x > __y);}))
274
#define isgreaterequal(x,y) \
275
          (__extension__ ({__typeof__(x) __x = (x); __typeof__(y) __y = (y); \
276
                           !isunordered(__x,__y) && (__x >= __y);}))
277
#define isless(x,y) \
278
          (__extension__ ({__typeof__(x) __x = (x); __typeof__(y) __y = (y); \
279
                           !isunordered(__x,__y) && (__x < __y);}))
280
#define islessequal(x,y) \
281
          (__extension__ ({__typeof__(x) __x = (x); __typeof__(y) __y = (y); \
282
                           !isunordered(__x,__y) && (__x <= __y);}))
283
#define islessgreater(x,y) \
284
          (__extension__ ({__typeof__(x) __x = (x); __typeof__(y) __y = (y); \
285
                           !isunordered(__x,__y) && (__x < __y || __x > __y);}))
286
 
287
#define isunordered(a,b) \
288
          (__extension__ ({__typeof__(a) __a = (a); __typeof__(b) __b = (b); \
289
                           fpclassify(__a) == FP_NAN || fpclassify(__b) == FP_NAN;}))
6536 serge 290
#endif
4349 Serge 291
 
6099 serge 292
/* Non ANSI long double precision functions.  */
293
 
294
extern int finitel _PARAMS((long double));
295
 
4349 Serge 296
/* Non ANSI double precision functions.  */
297
 
298
extern double infinity _PARAMS((void));
299
extern double nan _PARAMS((const char *));
300
extern int finite _PARAMS((double));
301
extern double copysign _PARAMS((double, double));
302
extern double logb _PARAMS((double));
303
extern int ilogb _PARAMS((double));
304
 
305
extern double asinh _PARAMS((double));
306
extern double cbrt _PARAMS((double));
307
extern double nextafter _PARAMS((double, double));
308
extern double rint _PARAMS((double));
309
extern double scalbn _PARAMS((double, int));
310
 
311
extern double exp2 _PARAMS((double));
312
extern double scalbln _PARAMS((double, long int));
313
extern double tgamma _PARAMS((double));
314
extern double nearbyint _PARAMS((double));
315
extern long int lrint _PARAMS((double));
6099 serge 316
extern long long int llrint _PARAMS((double));
4349 Serge 317
extern double round _PARAMS((double));
318
extern long int lround _PARAMS((double));
319
extern long long int llround _PARAMS((double));
320
extern double trunc _PARAMS((double));
321
extern double remquo _PARAMS((double, double, int *));
322
extern double fdim _PARAMS((double, double));
323
extern double fmax _PARAMS((double, double));
324
extern double fmin _PARAMS((double, double));
325
extern double fma _PARAMS((double, double, double));
326
 
327
#ifndef __math_68881
328
extern double log1p _PARAMS((double));
329
extern double expm1 _PARAMS((double));
330
#endif /* ! defined (__math_68881) */
331
 
332
#ifndef _REENT_ONLY
333
extern double acosh _PARAMS((double));
334
extern double atanh _PARAMS((double));
335
extern double remainder _PARAMS((double, double));
336
extern double gamma _PARAMS((double));
337
extern double lgamma _PARAMS((double));
338
extern double erf _PARAMS((double));
339
extern double erfc _PARAMS((double));
340
extern double log2 _PARAMS((double));
341
#if !defined(__cplusplus)
342
#define log2(x) (log (x) / _M_LN2)
343
#endif
344
 
345
#ifndef __math_68881
346
extern double hypot _PARAMS((double, double));
347
#endif
348
 
349
#endif /* ! defined (_REENT_ONLY) */
350
 
351
/* Single precision versions of ANSI functions.  */
352
 
353
extern float atanf _PARAMS((float));
354
extern float cosf _PARAMS((float));
355
extern float sinf _PARAMS((float));
356
extern float tanf _PARAMS((float));
357
extern float tanhf _PARAMS((float));
358
extern float frexpf _PARAMS((float, int *));
359
extern float modff _PARAMS((float, float *));
360
extern float ceilf _PARAMS((float));
361
extern float fabsf _PARAMS((float));
362
extern float floorf _PARAMS((float));
363
 
364
#ifndef _REENT_ONLY
365
extern float acosf _PARAMS((float));
366
extern float asinf _PARAMS((float));
367
extern float atan2f _PARAMS((float, float));
368
extern float coshf _PARAMS((float));
369
extern float sinhf _PARAMS((float));
370
extern float expf _PARAMS((float));
371
extern float ldexpf _PARAMS((float, int));
372
extern float logf _PARAMS((float));
373
extern float log10f _PARAMS((float));
374
extern float powf _PARAMS((float, float));
375
extern float sqrtf _PARAMS((float));
376
extern float fmodf _PARAMS((float, float));
377
#endif /* ! defined (_REENT_ONLY) */
378
 
379
/* Other single precision functions.  */
380
 
381
extern float exp2f _PARAMS((float));
382
extern float scalblnf _PARAMS((float, long int));
383
extern float tgammaf _PARAMS((float));
384
extern float nearbyintf _PARAMS((float));
385
extern long int lrintf _PARAMS((float));
6099 serge 386
extern long long int llrintf _PARAMS((float));
4349 Serge 387
extern float roundf _PARAMS((float));
388
extern long int lroundf _PARAMS((float));
389
extern long long int llroundf _PARAMS((float));
390
extern float truncf _PARAMS((float));
391
extern float remquof _PARAMS((float, float, int *));
392
extern float fdimf _PARAMS((float, float));
393
extern float fmaxf _PARAMS((float, float));
394
extern float fminf _PARAMS((float, float));
395
extern float fmaf _PARAMS((float, float, float));
396
 
397
extern float infinityf _PARAMS((void));
398
extern float nanf _PARAMS((const char *));
399
extern int finitef _PARAMS((float));
400
extern float copysignf _PARAMS((float, float));
401
extern float logbf _PARAMS((float));
402
extern int ilogbf _PARAMS((float));
403
 
404
extern float asinhf _PARAMS((float));
405
extern float cbrtf _PARAMS((float));
406
extern float nextafterf _PARAMS((float, float));
407
extern float rintf _PARAMS((float));
408
extern float scalbnf _PARAMS((float, int));
409
extern float log1pf _PARAMS((float));
410
extern float expm1f _PARAMS((float));
411
 
412
#ifndef _REENT_ONLY
413
extern float acoshf _PARAMS((float));
414
extern float atanhf _PARAMS((float));
415
extern float remainderf _PARAMS((float, float));
416
extern float gammaf _PARAMS((float));
417
extern float lgammaf _PARAMS((float));
418
extern float erff _PARAMS((float));
419
extern float erfcf _PARAMS((float));
420
extern float log2f _PARAMS((float));
421
extern float hypotf _PARAMS((float, float));
422
#endif /* ! defined (_REENT_ONLY) */
423
 
6536 serge 424
/* Newlib doesn't fully support long double math functions so far.
425
   On platforms where long double equals double the long double functions
426
   simply call the double functions.  On Cygwin the long double functions
427
   are implemented independently from newlib to be able to use optimized
428
   assembler functions despite using the Microsoft x86_64 ABI. */
429
#if defined (_LDBL_EQ_DBL) || defined (__CYGWIN__)
4349 Serge 430
/* Reentrant ANSI C functions.  */
431
#ifndef __math_68881
432
extern long double atanl _PARAMS((long double));
433
extern long double cosl _PARAMS((long double));
434
extern long double sinl _PARAMS((long double));
435
extern long double tanl _PARAMS((long double));
436
extern long double tanhl _PARAMS((long double));
6099 serge 437
extern long double frexpl _PARAMS((long double, int *));
4349 Serge 438
extern long double modfl _PARAMS((long double, long double *));
439
extern long double ceill _PARAMS((long double));
440
extern long double fabsl _PARAMS((long double));
441
extern long double floorl _PARAMS((long double));
442
extern long double log1pl _PARAMS((long double));
443
extern long double expm1l _PARAMS((long double));
444
#endif /* ! defined (__math_68881) */
445
/* Non reentrant ANSI C functions.  */
446
#ifndef _REENT_ONLY
447
#ifndef __math_68881
448
extern long double acosl _PARAMS((long double));
449
extern long double asinl _PARAMS((long double));
450
extern long double atan2l _PARAMS((long double, long double));
451
extern long double coshl _PARAMS((long double));
452
extern long double sinhl _PARAMS((long double));
453
extern long double expl _PARAMS((long double));
454
extern long double ldexpl _PARAMS((long double, int));
455
extern long double logl _PARAMS((long double));
456
extern long double log10l _PARAMS((long double));
457
extern long double powl _PARAMS((long double, long double));
458
extern long double sqrtl _PARAMS((long double));
459
extern long double fmodl _PARAMS((long double, long double));
460
extern long double hypotl _PARAMS((long double, long double));
461
#endif /* ! defined (__math_68881) */
462
#endif /* ! defined (_REENT_ONLY) */
463
extern long double copysignl _PARAMS((long double, long double));
464
extern long double nanl _PARAMS((const char *));
465
extern int ilogbl _PARAMS((long double));
466
extern long double asinhl _PARAMS((long double));
467
extern long double cbrtl _PARAMS((long double));
468
extern long double nextafterl _PARAMS((long double, long double));
6099 serge 469
extern float nexttowardf _PARAMS((float, long double));
470
extern double nexttoward _PARAMS((double, long double));
471
extern long double nexttowardl _PARAMS((long double, long double));
472
extern long double logbl _PARAMS((long double));
473
extern long double log2l _PARAMS((long double));
4349 Serge 474
extern long double rintl _PARAMS((long double));
475
extern long double scalbnl _PARAMS((long double, int));
476
extern long double exp2l _PARAMS((long double));
477
extern long double scalblnl _PARAMS((long double, long));
478
extern long double tgammal _PARAMS((long double));
479
extern long double nearbyintl _PARAMS((long double));
480
extern long int lrintl _PARAMS((long double));
481
extern long long int llrintl _PARAMS((long double));
482
extern long double roundl _PARAMS((long double));
483
extern long lroundl _PARAMS((long double));
6099 serge 484
extern long long int llroundl _PARAMS((long double));
4349 Serge 485
extern long double truncl _PARAMS((long double));
486
extern long double remquol _PARAMS((long double, long double, int *));
487
extern long double fdiml _PARAMS((long double, long double));
488
extern long double fmaxl _PARAMS((long double, long double));
489
extern long double fminl _PARAMS((long double, long double));
490
extern long double fmal _PARAMS((long double, long double, long double));
491
#ifndef _REENT_ONLY
492
extern long double acoshl _PARAMS((long double));
493
extern long double atanhl _PARAMS((long double));
494
extern long double remainderl _PARAMS((long double, long double));
495
extern long double lgammal _PARAMS((long double));
496
extern long double erfl _PARAMS((long double));
497
extern long double erfcl _PARAMS((long double));
498
#endif /* ! defined (_REENT_ONLY) */
6536 serge 499
#else /* !_LDBL_EQ_DBL && !__CYGWIN__ */
6099 serge 500
extern long double hypotl _PARAMS((long double, long double));
501
extern long double sqrtl _PARAMS((long double));
4349 Serge 502
#ifdef __i386__
503
/* Other long double precision functions.  */
504
extern _LONG_DOUBLE rintl _PARAMS((_LONG_DOUBLE));
505
extern long int lrintl _PARAMS((_LONG_DOUBLE));
6099 serge 506
extern long long int llrintl _PARAMS((_LONG_DOUBLE));
4349 Serge 507
#endif /* __i386__ */
6536 serge 508
#endif /* !_LDBL_EQ_DBL && !__CYGWIN__ */
4349 Serge 509
 
6536 serge 510
#endif /* __ISO_C_VISIBLE >= 1999 */
4349 Serge 511
 
6536 serge 512
#if __MISC_VISIBLE
4349 Serge 513
extern double drem _PARAMS((double, double));
6536 serge 514
extern float dremf _PARAMS((float, float));
515
#ifdef __CYGWIN__
516
extern float dreml _PARAMS((long double, long double));
517
#endif /* __CYGWIN__ */
4349 Serge 518
extern double gamma_r _PARAMS((double, int *));
519
extern double lgamma_r _PARAMS((double, int *));
6536 serge 520
extern float gammaf_r _PARAMS((float, int *));
521
extern float lgammaf_r _PARAMS((float, int *));
522
#endif
4349 Serge 523
 
6536 serge 524
#if __MISC_VISIBLE || __XSI_VISIBLE
4349 Serge 525
extern double y0 _PARAMS((double));
526
extern double y1 _PARAMS((double));
527
extern double yn _PARAMS((int, double));
528
extern double j0 _PARAMS((double));
529
extern double j1 _PARAMS((double));
530
extern double jn _PARAMS((int, double));
6536 serge 531
#endif
4349 Serge 532
 
6536 serge 533
#if __MISC_VISIBLE || __XSI_VISIBLE >= 600
4349 Serge 534
extern float y0f _PARAMS((float));
535
extern float y1f _PARAMS((float));
536
extern float ynf _PARAMS((int, float));
537
extern float j0f _PARAMS((float));
538
extern float j1f _PARAMS((float));
539
extern float jnf _PARAMS((int, float));
6536 serge 540
#endif
4349 Serge 541
 
542
/* GNU extensions */
6536 serge 543
#if __GNU_VISIBLE
544
extern void sincos _PARAMS((double, double *, double *));
545
extern void sincosf _PARAMS((float, float *, float *));
546
#ifdef __CYGWIN__
547
extern void sincosl _PARAMS((long double, long double *, long double *));
548
#endif /* __CYGWIN__ */
4349 Serge 549
# ifndef exp10
550
extern double exp10 _PARAMS((double));
551
# endif
552
# ifndef pow10
553
extern double pow10 _PARAMS((double));
554
# endif
555
# ifndef exp10f
556
extern float exp10f _PARAMS((float));
557
# endif
558
# ifndef pow10f
559
extern float pow10f _PARAMS((float));
560
# endif
6536 serge 561
#ifdef __CYGWIN__
562
# ifndef exp10l
563
extern float exp10l _PARAMS((float));
564
# endif
565
# ifndef pow10l
566
extern float pow10l _PARAMS((float));
567
# endif
568
#endif /* __CYGWIN__ */
569
#endif /* __GNU_VISIBLE */
4349 Serge 570
 
6536 serge 571
#if __MISC_VISIBLE || __XSI_VISIBLE
4349 Serge 572
/* The gamma functions use a global variable, signgam.  */
573
#ifndef _REENT_ONLY
574
#define signgam (*__signgam())
575
extern int *__signgam _PARAMS((void));
576
#endif /* ! defined (_REENT_ONLY) */
577
 
578
#define __signgam_r(ptr) _REENT_SIGNGAM(ptr)
6536 serge 579
#endif /* __MISC_VISIBLE || __XSI_VISIBLE */
4349 Serge 580
 
6536 serge 581
#if __SVID_VISIBLE
4349 Serge 582
/* The exception structure passed to the matherr routine.  */
583
/* We have a problem when using C++ since `exception' is a reserved
584
   name in C++.  */
585
#ifdef __cplusplus
586
struct __exception
587
#else
588
struct exception
589
#endif
590
{
591
  int type;
592
  char *name;
593
  double arg1;
594
  double arg2;
595
  double retval;
596
  int err;
597
};
598
 
599
#ifdef __cplusplus
600
extern int matherr _PARAMS((struct __exception *e));
601
#else
602
extern int matherr _PARAMS((struct exception *e));
603
#endif
604
 
605
/* Values for the type field of struct exception.  */
606
 
607
#define DOMAIN 1
608
#define SING 2
609
#define OVERFLOW 3
610
#define UNDERFLOW 4
611
#define TLOSS 5
612
#define PLOSS 6
613
 
6536 serge 614
#endif /* __SVID_VISIBLE */
6099 serge 615
 
4349 Serge 616
/* Useful constants.  */
617
 
6536 serge 618
#if __BSD_VISIBLE || __XSI_VISIBLE >= 500
6099 serge 619
 
4349 Serge 620
#define MAXFLOAT	3.40282347e+38F
621
 
622
#define M_E		2.7182818284590452354
623
#define M_LOG2E		1.4426950408889634074
624
#define M_LOG10E	0.43429448190325182765
625
#define M_LN2		_M_LN2
626
#define M_LN10		2.30258509299404568402
627
#define M_PI		3.14159265358979323846
628
#define M_PI_2		1.57079632679489661923
629
#define M_PI_4		0.78539816339744830962
630
#define M_1_PI		0.31830988618379067154
631
#define M_2_PI		0.63661977236758134308
632
#define M_2_SQRTPI	1.12837916709551257390
633
#define M_SQRT2		1.41421356237309504880
634
#define M_SQRT1_2	0.70710678118654752440
6099 serge 635
 
636
#endif
637
 
6536 serge 638
#if __BSD_VISIBLE
6099 serge 639
 
640
#define M_TWOPI         (M_PI * 2.0)
641
#define M_3PI_4		2.3561944901923448370E0
642
#define M_SQRTPI        1.77245385090551602792981
4349 Serge 643
#define M_LN2LO         1.9082149292705877000E-10
644
#define M_LN2HI         6.9314718036912381649E-1
645
#define M_SQRT3	1.73205080756887719000
646
#define M_IVLN10        0.43429448190325182765 /* 1 / log(10) */
647
#define M_LOG2_E        _M_LN2
648
#define M_INVLN2        1.4426950408889633870E0  /* 1 / log(2) */
649
 
650
/* Global control over fdlibm error handling.  */
651
 
652
enum __fdlibm_version
653
{
654
  __fdlibm_ieee = -1,
655
  __fdlibm_svid,
656
  __fdlibm_xopen,
657
  __fdlibm_posix
658
};
659
 
660
#define _LIB_VERSION_TYPE enum __fdlibm_version
661
#define _LIB_VERSION __fdlib_version
662
 
663
extern __IMPORT _LIB_VERSION_TYPE _LIB_VERSION;
664
 
665
#define _IEEE_  __fdlibm_ieee
666
#define _SVID_  __fdlibm_svid
667
#define _XOPEN_ __fdlibm_xopen
668
#define _POSIX_ __fdlibm_posix
669
 
6536 serge 670
#endif /* __BSD_VISIBLE */
4349 Serge 671
 
672
_END_STD_C
673
 
674
#ifdef __FAST_MATH__
675
#include 
676
#endif
677
 
678
#endif /* _MATH_H_ */