Project

General

Profile

Statistics
| Revision:

root / lab4 / .minix-src / include / math.h @ 13

History | View | Annotate | Download (14.6 KB)

1
/*        $NetBSD: math.h,v 1.63 2013/09/16 15:54:42 martin Exp $        */
2

    
3
/*
4
 * ====================================================
5
 * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
6
 *
7
 * Developed at SunPro, a Sun Microsystems, Inc. business.
8
 * Permission to use, copy, modify, and distribute this
9
 * software is freely granted, provided that this notice
10
 * is preserved.
11
 * ====================================================
12
 */
13

    
14
/*
15
 * @(#)fdlibm.h 5.1 93/09/24
16
 */
17

    
18
#ifndef _MATH_H_
19
#define _MATH_H_
20

    
21
#include <sys/cdefs.h>
22
#include <sys/featuretest.h>
23

    
24
union __float_u {
25
        unsigned char __dummy[sizeof(float)];
26
        float __val;
27
};
28

    
29
union __double_u {
30
        unsigned char __dummy[sizeof(double)];
31
        double __val;
32
};
33

    
34
union __long_double_u {
35
        unsigned char __dummy[sizeof(long double)];
36
        long double __val;
37
};
38

    
39
#include <machine/math.h>                /* may use __float_u, __double_u,
40
                                           or __long_double_u */
41
#include <limits.h>                        /* for INT_{MIN,MAX} */
42

    
43
#if ((_POSIX_C_SOURCE - 0) >= 200809L || defined(_NETBSD_SOURCE))
44
#  if defined(__FLT_EVAL_METHOD__) && (__FLT_EVAL_METHOD__ - 0) == 0
45
typedef double double_t;
46
typedef float float_t;
47
#  elif (__FLT_EVAL_METHOD__ - 0) == 1
48
typedef double double_t;
49
typedef double float_t;
50
#  elif (__FLT_EVAL_METHOD__ - 0) == 2
51
typedef long double double_t;
52
typedef long double float_t;
53
#  endif
54
#endif
55

    
56
#ifdef __HAVE_LONG_DOUBLE
57
#define        __fpmacro_unary_floating(__name, __arg0)                        \
58
        /* LINTED */                                                        \
59
        ((sizeof (__arg0) == sizeof (float))                                \
60
        ?        __ ## __name ## f (__arg0)                                \
61
        : (sizeof (__arg0) == sizeof (double))                                \
62
        ?        __ ## __name ## d (__arg0)                                \
63
        :        __ ## __name ## l (__arg0))
64
#else
65
#define        __fpmacro_unary_floating(__name, __arg0)                        \
66
        /* LINTED */                                                        \
67
        ((sizeof (__arg0) == sizeof (float))                                \
68
        ?        __ ## __name ## f (__arg0)                                \
69
        :        __ ## __name ## d (__arg0))
70
#endif /* __HAVE_LONG_DOUBLE */
71

    
72
/*
73
 * ANSI/POSIX
74
 */
75
/* 7.12#3 HUGE_VAL, HUGELF, HUGE_VALL */
76
#if __GNUC_PREREQ__(3, 3)
77
#define HUGE_VAL        __builtin_huge_val()
78
#else
79
extern const union __double_u __infinity;
80
#define HUGE_VAL        __infinity.__val
81
#endif
82

    
83
/*
84
 * ISO C99
85
 */
86
#if !defined(_ANSI_SOURCE) && !defined(_POSIX_C_SOURCE) && \
87
    !defined(_XOPEN_SOURCE) || \
88
    ((__STDC_VERSION__ - 0) >= 199901L) || \
89
    ((_POSIX_C_SOURCE - 0) >= 200112L) || \
90
    ((_XOPEN_SOURCE  - 0) >= 600) || \
91
    defined(_ISOC99_SOURCE) || defined(_NETBSD_SOURCE)
92
/* 7.12#3 HUGE_VAL, HUGELF, HUGE_VALL */
93
#if __GNUC_PREREQ__(3, 3)
94
#define        HUGE_VALF        __builtin_huge_valf()
95
#define        HUGE_VALL        __builtin_huge_vall()
96
#else
97
extern const union __float_u __infinityf;
98
#define        HUGE_VALF        __infinityf.__val
99

    
100
extern const union __long_double_u __infinityl;
101
#define        HUGE_VALL        __infinityl.__val
102
#endif
103

    
104
/* 7.12#4 INFINITY */
105
#if defined(__INFINITY)
106
#define        INFINITY        __INFINITY        /* float constant which overflows */
107
#elif __GNUC_PREREQ__(3, 3)
108
#define        INFINITY        __builtin_inff()
109
#else
110
#define        INFINITY        HUGE_VALF        /* positive infinity */
111
#endif /* __INFINITY */
112

    
113
/* 7.12#5 NAN: a quiet NaN, if supported */
114
#ifdef __HAVE_NANF
115
#if __GNUC_PREREQ__(3,3)
116
#define        NAN        __builtin_nanf("")
117
#else
118
extern const union __float_u __nanf;
119
#define        NAN                __nanf.__val
120
#endif
121
#endif /* __HAVE_NANF */
122

    
123
/* 7.12#6 number classification macros */
124
#define        FP_INFINITE        0x00
125
#define        FP_NAN                0x01
126
#define        FP_NORMAL        0x02
127
#define        FP_SUBNORMAL        0x03
128
#define        FP_ZERO                0x04
129
/* NetBSD extensions */
130
#define        _FP_LOMD        0x80                /* range for machine-specific classes */
131
#define        _FP_HIMD        0xff
132

    
133
#define        FP_ILOGB0        INT_MIN
134
#define        FP_ILOGBNAN        INT_MAX
135

    
136
#endif /* !_ANSI_SOURCE && ... */
137

    
138
/*
139
 * XOPEN/SVID
140
 */
141
#if defined(_XOPEN_SOURCE) || defined(_NETBSD_SOURCE)
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)
157
extern int signgam;
158
#endif /* _XOPEN_SOURCE || _NETBSD_SOURCE */
159

    
160
#if defined(_NETBSD_SOURCE)
161
enum fdversion {fdlibm_ieee = -1, fdlibm_svid, fdlibm_xopen, fdlibm_posix};
162

    
163
#define _LIB_VERSION_TYPE enum fdversion
164
#define _LIB_VERSION _fdlib_version
165

    
166
/* if global variable _LIB_VERSION is not desirable, one may
167
 * change the following to be a constant by:
168
 *        #define _LIB_VERSION_TYPE const enum version
169
 * In that case, after one initializes the value _LIB_VERSION (see
170
 * s_lib_version.c) during compile time, it cannot be modified
171
 * in the middle of a program
172
 */
173
extern  _LIB_VERSION_TYPE  _LIB_VERSION;
174

    
175
#define _IEEE_  fdlibm_ieee
176
#define _SVID_  fdlibm_svid
177
#define _XOPEN_ fdlibm_xopen
178
#define _POSIX_ fdlibm_posix
179

    
180
#ifndef __cplusplus
181
struct exception {
182
        int type;
183
        const char *name;
184
        double arg1;
185
        double arg2;
186
        double retval;
187
};
188
#endif
189

    
190
#define        HUGE                MAXFLOAT
191

    
192
/*
193
 * set X_TLOSS = pi*2**52, which is possibly defined in <values.h>
194
 * (one may replace the following line by "#include <values.h>")
195
 */
196

    
197
#define X_TLOSS                1.41484755040568800000e+16
198

    
199
#define        DOMAIN                1
200
#define        SING                2
201
#define        OVERFLOW        3
202
#define        UNDERFLOW        4
203
#define        TLOSS                5
204
#define        PLOSS                6
205

    
206
#endif /* _NETBSD_SOURCE */
207

    
208
__BEGIN_DECLS
209
/*
210
 * ANSI/POSIX
211
 */
212
double        acos(double);
213
double        asin(double);
214
double        atan(double);
215
double        atan2(double, double);
216
double        cos(double);
217
double        sin(double);
218
double        tan(double);
219

    
220
double        cosh(double);
221
double        sinh(double);
222
double        tanh(double);
223

    
224
double        exp(double);
225
double        exp2(double);
226
double        frexp(double, int *);
227
double        ldexp(double, int);
228
double        log(double);
229
double        log2(double);
230
double        log10(double);
231
double        modf(double, double *);
232

    
233
double        pow(double, double);
234
double        sqrt(double);
235

    
236
double        ceil(double);
237
double        fabs(double);
238
double        floor(double);
239
double        fmod(double, double);
240

    
241
#if defined(_XOPEN_SOURCE) || defined(_NETBSD_SOURCE)
242
double        erf(double);
243
double        erfc(double);
244
double        gamma(double);
245
double        hypot(double, double);
246
int        finite(double);
247
double        j0(double);
248
double        j1(double);
249
double        jn(int, double);
250
double        lgamma(double);
251
double        y0(double);
252
double        y1(double);
253
double        yn(int, double);
254

    
255
#if (_XOPEN_SOURCE - 0) >= 500 || defined(_NETBSD_SOURCE)
256
double        acosh(double);
257
double        asinh(double);
258
double        atanh(double);
259
double        cbrt(double);
260
double        expm1(double);
261
int        ilogb(double);
262
double        log1p(double);
263
double        logb(double);
264
double        nextafter(double, double);
265
double        remainder(double, double);
266
double        rint(double);
267
double        scalb(double, double);
268
#endif /* (_XOPEN_SOURCE - 0) >= 500 || defined(_NETBSD_SOURCE)*/
269
#endif /* _XOPEN_SOURCE || _NETBSD_SOURCE */
270

    
271
/*
272
 * ISO C99
273
 */
274
#if !defined(_ANSI_SOURCE) && !defined(_POSIX_C_SOURCE) && \
275
    !defined(_XOPEN_SOURCE) || \
276
    ((__STDC_VERSION__ - 0) >= 199901L) || \
277
    ((_POSIX_C_SOURCE - 0) >= 200112L) || \
278
    ((_XOPEN_SOURCE  - 0) >= 600) || \
279
    defined(_ISOC99_SOURCE) || defined(_NETBSD_SOURCE)
280
/* 7.12.3.1 int fpclassify(real-floating x) */
281
#define        fpclassify(__x)        __fpmacro_unary_floating(fpclassify, __x)
282

    
283
/* 7.12.3.2 int isfinite(real-floating x) */
284
#define        isfinite(__x)        __fpmacro_unary_floating(isfinite, __x)
285

    
286
/* 7.12.3.5 int isnormal(real-floating x) */
287
#define        isnormal(__x)        (fpclassify(__x) == FP_NORMAL)
288

    
289
/* 7.12.3.6 int signbit(real-floating x) */
290
#define        signbit(__x)        __fpmacro_unary_floating(signbit, __x)
291

    
292
/* 7.12.4 trigonometric */
293

    
294
float        acosf(float);
295
float        asinf(float);
296
float        atanf(float);
297
float        atan2f(float, float);
298
float        cosf(float);
299
float        sinf(float);
300
float        tanf(float);
301

    
302
long double        acosl(long double);
303
long double        asinl(long double);
304
long double        atanl(long double);
305
long double        atan2l(long double, long double);
306
long double        cosl(long double);
307
long double        sinl(long double);
308
long double        tanl(long double);
309

    
310
/* 7.12.5 hyperbolic */
311

    
312
float        acoshf(float);
313
float        asinhf(float);
314
float        atanhf(float);
315
float        coshf(float);
316
float        sinhf(float);
317
float        tanhf(float);
318
long double        acoshl(long double);
319
long double        asinhl(long double);
320
long double        atanhl(long double);
321
long double        coshl(long double);
322
long double        sinhl(long double);
323
long double        tanhl(long double);
324

    
325
/* 7.12.6 exp / log */
326

    
327
float        expf(float);
328
float        exp2f(float);
329
float        expm1f(float);
330
float        frexpf(float, int *);
331
int        ilogbf(float);
332
float        ldexpf(float, int);
333
float        logf(float);
334
float        log2f(float);
335
float        log10f(float);
336
float        log1pf(float);
337
float        logbf(float);
338
float        modff(float, float *);
339
float        scalbnf(float, int);
340
float        scalblnf(float, long);
341

    
342
long double        expl(long double);
343
long double        exp2l(long double);
344
long double        expm1l(long double);
345
long double        frexpl(long double, int *);
346
int                ilogbl(long double);
347
long double        ldexpl(long double, int);
348
long double        logl(long double);
349
long double        log2l(long double);
350
long double        log10l(long double);
351
long double        log1pl(long double);
352
long double        logbl(long double);
353
long double        modfl(long double, long double *);
354
long double        scalbnl(long double, int);
355
long double        scalblnl(long double, long);
356

    
357

    
358
/* 7.12.7 power / absolute */
359

    
360
float        cbrtf(float);
361
float        fabsf(float);
362
float        hypotf(float, float);
363
float        powf(float, float);
364
float        sqrtf(float);
365
long double        cbrtl(long double);
366
long double        fabsl(long double);
367
long double        hypotl(long double, long double);
368
long double        powl(long double, long double);
369
long double        sqrtl(long double);
370

    
371
/* 7.12.8 error / gamma */
372

    
373
double        tgamma(double);
374
float        erff(float);
375
float        erfcf(float);
376
float        lgammaf(float);
377
float        tgammaf(float);
378
long double        erfl(long double);
379
long double        erfcl(long double);
380
long double        lgammal(long double);
381
long double        tgammal(long double);
382

    
383
/* 7.12.9 nearest integer */
384

    
385
/* LONGLONG */
386
long long int        llrint(double);
387
long int        lround(double);
388
/* LONGLONG */
389
long long int        llround(double);
390
long int        lrint(double);
391
double        round(double);
392
double        trunc(double);
393

    
394
float        ceilf(float);
395
float        floorf(float);
396
/* LONGLONG */
397
long long int        llrintf(float);
398
long int        lroundf(float);
399
/* LONGLONG */
400
long long int        llroundf(float);
401
long int        lrintf(float);
402
float        rintf(float);
403
float        roundf(float);
404
float        truncf(float);
405
long double        ceill(long double);
406
long double        floorl(long double);
407
/* LONGLONG */
408
long long int        llrintl(long double);
409
long int        lroundl(long double);
410
/* LONGLONG */
411
long long int        llroundl(long double);
412
long int        lrintl(long double);
413
long double        rintl(long double);
414
long double        roundl(long double);
415
long double        truncl(long double);
416

    
417
/* 7.12.10 remainder */
418

    
419
float        fmodf(float, float);
420
float        remainderf(float, float);
421
long double        fmodl(long double, long double);
422
long double        remainderl(long double, long double);
423

    
424
/* 7.12.10.3 The remquo functions */
425
double        remquo(double, double, int *);
426
float        remquof(float, float, int *);
427
long double        remquol(long double, long double, int *);
428

    
429
/* 7.12.11 manipulation */
430

    
431
double        nan(const char *);
432
double        nearbyint(double);
433
double        nexttoward(double, long double);
434
float        copysignf(float, float);
435
float        nanf(const char *);
436
float        nearbyintf(float);
437
float        nextafterf(float, float);
438
float        nexttowardf(float, long double);
439
long double        copysignl(long double, long double);
440
long double        nanl(const char *);
441
long double        nearbyintl(long double);
442
long double     nextafterl(long double, long double);
443
long double        nexttowardl(long double, long double);
444

    
445
/* 7.12.14 comparison */
446

    
447
#define isunordered(x, y)        (isnan(x) || isnan(y))
448
#define isgreater(x, y)                (!isunordered((x), (y)) && (x) > (y))
449
#define isgreaterequal(x, y)        (!isunordered((x), (y)) && (x) >= (y))
450
#define isless(x, y)                (!isunordered((x), (y)) && (x) < (y))
451
#define islessequal(x, y)        (!isunordered((x), (y)) && (x) <= (y))
452
#define islessgreater(x, y)        (!isunordered((x), (y)) && \
453
                                 ((x) > (y) || (y) > (x)))
454
double        fdim(double, double);
455
double        fma(double, double, double);
456
double        fmax(double, double);
457
double        fmin(double, double);
458
float        fdimf(float, float);
459
float        fmaf(float, float, float);
460
float        fmaxf(float, float);
461
float        fminf(float, float);
462
long double fdiml(long double, long double);
463
long double fmal(long double, long double, long double);
464
long double fmaxl(long double, long double);
465
long double fminl(long double, long double);
466

    
467
#endif /* !_ANSI_SOURCE && ... */
468

    
469
#if !defined(_ANSI_SOURCE) && !defined(_POSIX_C_SOURCE) || \
470
    !defined(_XOPEN_SOURCE) || \
471
    ((__STDC_VERSION__ - 0) >= 199901L) || \
472
    ((_POSIX_C_SOURCE - 0) >= 200112L) || \
473
    defined(_ISOC99_SOURCE) || defined(_NETBSD_SOURCE)
474
/* 7.12.3.3 int isinf(real-floating x) */
475
#if defined(__isinf) || defined(__HAVE_INLINE___ISINF)
476
#define        isinf(__x)        __isinf(__x)
477
#else
478
#define        isinf(__x)        __fpmacro_unary_floating(isinf, __x)
479
#endif
480

    
481
/* 7.12.3.4 int isnan(real-floating x) */
482
#if defined(__isnan) || defined(__HAVE_INLINE___ISNAN)
483
#define        isnan(__x)        __isnan(__x)
484
#else
485
#define        isnan(__x)        __fpmacro_unary_floating(isnan, __x)
486
#endif
487
#endif /* !_ANSI_SOURCE && ... */
488

    
489
#if defined(_NETBSD_SOURCE)
490
#ifndef __cplusplus
491
int        matherr(struct exception *);
492
#endif
493

    
494
/*
495
 * IEEE Test Vector
496
 */
497
double        significand(double);
498

    
499
/*
500
 * Functions callable from C, intended to support IEEE arithmetic.
501
 */
502
double        copysign(double, double);
503
double        scalbn(double, int);
504
double        scalbln(double, long);
505

    
506
/*
507
 * BSD math library entry points
508
 */
509
double        drem(double, double);
510

    
511
#endif /* _NETBSD_SOURCE */
512

    
513
#if defined(_NETBSD_SOURCE) || defined(_REENTRANT)
514
/*
515
 * Reentrant version of gamma & lgamma; passes signgam back by reference
516
 * as the second argument; user must allocate space for signgam.
517
 */
518
double        gamma_r(double, int *);
519
double        lgamma_r(double, int *);
520
#endif /* _NETBSD_SOURCE || _REENTRANT */
521

    
522

    
523
#if defined(_NETBSD_SOURCE)
524

    
525
/* float versions of ANSI/POSIX functions */
526

    
527
float        gammaf(float);
528
int        isinff(float);
529
int        isnanf(float);
530
int        finitef(float);
531
float        j0f(float);
532
float        j1f(float);
533
float        jnf(int, float);
534
float        y0f(float);
535
float        y1f(float);
536
float        ynf(int, float);
537

    
538
float        scalbf(float, float);
539

    
540
/*
541
 * float version of IEEE Test Vector
542
 */
543
float        significandf(float);
544

    
545
/*
546
 * float versions of BSD math library entry points
547
 */
548
float        dremf(float, float);
549
#endif /* _NETBSD_SOURCE */
550

    
551
#if defined(_NETBSD_SOURCE) || defined(_REENTRANT)
552
/*
553
 * Float versions of reentrant version of gamma & lgamma; passes
554
 * signgam back by reference as the second argument; user must
555
 * allocate space for signgam.
556
 */
557
float        gammaf_r(float, int *);
558
float        lgammaf_r(float, int *);
559
#endif /* !... || _REENTRANT */
560

    
561
/*
562
 * Library implementation
563
 */
564
int        __fpclassifyf(float);
565
int        __fpclassifyd(double);
566
int        __isfinitef(float);
567
int        __isfinited(double);
568
int        __isinff(float);
569
int        __isinfd(double);
570
int        __isnanf(float);
571
int        __isnand(double);
572
int        __signbitf(float);
573
int        __signbitd(double);
574

    
575
#ifdef __HAVE_LONG_DOUBLE
576
int        __fpclassifyl(long double);
577
int        __isfinitel(long double);
578
int        __isinfl(long double);
579
int        __isnanl(long double);
580
int        __signbitl(long double);
581
#endif
582

    
583
__END_DECLS
584

    
585
#endif /* _MATH_H_ */