summaryrefslogtreecommitdiff
path: root/StdLib/Include/math.h
blob: 3041120087ad188a3713c45ae031f52ed38ecb8b (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
/** @file
  Floating-point Math functions and macros.

  Copyright (c) 2010 - 2011, Intel Corporation. All rights reserved.<BR>
  This program and the accompanying materials are licensed and made available under
  the terms and conditions of the BSD License that accompanies this distribution.
  The full text of the license may be found at
  http://opensource.org/licenses/bsd-license.

  THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
  WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.

 * ====================================================
 * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
 *
 * Developed at SunPro, a Sun Microsystems, Inc. business.
 * Permission to use, copy, modify, and distribute this
 * software is freely granted, provided that this notice
 * is preserved.
 * ====================================================

    NetBSD: math.h,v 1.44 2006/03/25 16:41:11 xtraeme Exp
    dlibm.h 5.1 93/09/24
**/
#ifndef _MATH_H_
#define _MATH_H_

#include  <sys/EfiCdefs.h>
#include  <sys/featuretest.h>

/** @{
    @brief    These are forward references to unions and macros used internaly
              by the implementation of the math functions and macros.
**/
union __float_u {
  unsigned char __dummy[sizeof(float)];
  float __val;
};

union __double_u {
  unsigned char __dummy[sizeof(double)];
  double __val;
};

union __long_double_u {
  unsigned char __dummy[sizeof(long double)];
  long double __val;
};

#include <machine/math.h>   /* may use __float_u, __double_u, or __long_double_u */

#ifdef __HAVE_LONG_DOUBLE
#define __fpmacro_unary_floating(__name, __arg0)      \
  /* LINTED */              \
  ((sizeof (__arg0) == sizeof (float))        \
  ? __ ## __name ## f (__arg0)        \
  : (sizeof (__arg0) == sizeof (double))        \
  ? __ ## __name ## d (__arg0)        \
  : __ ## __name ## l (__arg0))
#else
#define __fpmacro_unary_floating(__name, __arg0)      \
  /* LINTED */              \
  ((sizeof (__arg0) == sizeof (float))        \
  ? __ ## __name ## f (__arg0)        \
  : __ ## __name ## d (__arg0))
#endif /* __HAVE_LONG_DOUBLE */

extern const union __double_u       __infinity;
extern const union __float_u        __infinityf;
extern const union __long_double_u  __infinityl;

/* C99 7.12.3.1 int fpclassify(real-floating x) */
#define fpclassify(__x) __fpmacro_unary_floating(fpclassify, __x)

/* C99 7.12.3.3 int isinf(real-floating x) */
#ifdef __isinf
  #define isinf(__x)  __isinf(__x)
#else
  #define isinf(__x)  __fpmacro_unary_floating(isinf, __x)
#endif

/* C99 7.12.3.4 int isnan(real-floating x) */
#ifdef __isnan
  #define isnan(__x)  __isnan(__x)
#else
  #define isnan(__x)  __fpmacro_unary_floating(isnan, __x)
#endif
/*@)*/

/*#############################################################
 * ISO C95
 */

/**@{
    Double, float, and long double versions, respectively, of HUGE_VAL.
*/
#define HUGE_VAL  __infinity.__val
#define HUGE_VALF __infinityf.__val
#define HUGE_VALL __infinityl.__val
/*@)*/

__BEGIN_DECLS
/*
 * ANSI/POSIX
 */
/** Compute the principal value of the arc cosine of Arg.

    @param[in]    Arg   The value to compute the arc cosine of.

    @return   The computed value of the arc cosine of Arg in the interval [0,pi] radians.
              If Arg is not in the interval [-1,+1], errno is set to EDOM.
**/
double  acos(double Arg);

/** Compute the principal value of the arc sine of Arg.

    @param[in]    Arg   The value to compute the arc sine of.

    @return   The computed value of the arc sine of Arg in the interval [-pi/2,+pi/2] radians.
              If Arg is not in the interval [-1,+1], errno is set to EDOM.
**/
double  asin(double Arg);

/** Compute the principal value of the arc tangent of Arg.

    @param[in]    Arg   The value to compute the arc tangent of.

    @return   The computed value of the arc tangent of Arg in the interval [-pi/2,+pi/2] radians.
**/
double  atan(double Arg);

/** Compute the value of the arc tangent of (Num / Denom).
    The sign of both arguments is used to determine the quadrant of the return value.

    @param[in]    Num   The numerator of the value to compute the arc tangent of.
    @param[in]    Denom The denominator of the value to compute the arc tangent of.

    @return   The computed value of the arc tangent of (Num / Denom) in the interval [-pi,+pi] radians.
**/
double  atan2(double Num, double Denom);

/** Compute the value of the cosine of Arg, measured in radians.

    @param[in]    Arg   The value to compute the cosine of.

    @return   The computed value of the cosine of Arg.
**/
double  cos(double Arg);

/** Compute the value of the sine of Arg.

    @param[in]    Arg   The value to compute the sine of.

    @return   The computed value of the sine of Arg.
**/
double  sin(double Arg);

/** Compute the value of the tangent of Arg.

    @param[in]    Arg   The value to compute the tangent of.

    @return   The computed value of the tangent of Arg.
**/
double  tan(double Arg);


/** Compute the value of the hyperbolic cosine of Arg.

    @param[in]    Arg   The value to compute the hyperbolic cosine of.

    @return   The computed value of the hyperbolic cosine of Arg.
              If the magnitude of Arg is too large, errno is set to ERANGE.
**/
double  cosh(double Arg);

/** Compute the value of the hyperbolic sine of Arg.

    @param[in]    Arg   The value to compute the hyperbolic sine of.

    @return   The computed value of the hyperbolic sine of Arg.
              If the magnitude of Arg is too large, errno is set to ERANGE.
**/
double  sinh(double Arg);

/** Compute the value of the hyperbolic tangent of Arg.

    @param[in]    Arg   The value to compute the hyperbolic tangent of.

    @return   The computed value of the hyperbolic tangent of Arg.
**/
double  tanh(double Arg);


/** Compute the base-e exponential of Arg.

    @param[in]    Arg   The value to compute the base-e exponential of.

    @return   The computed value of e**Arg.
              If the magnitude of Arg is too large, errno is set to ERANGE.
**/
double  exp(double Arg);

/** Break a floating-point number into a normalized fraction and an integral power of 2.

    @param[in]    Value   The floating-point value to be broken down.
    @param[out]   Exp     A pointer to an integer object to receive the integral power of 2 exponent.

    @return   The frexp function returns a value R, such that Value == R**Exp.
              If Value is zero, both parts of the result are zero.
**/
double  frexp(double Value, int *Exp);

/** Multiply a floating-point number, Value, by an integral power of 2, Exp.

    @param[in]    Value   The floating-point value to be multiplied.
    @param[out]   Exp     The integral power of 2 to multiply Value by.

    @return   The ldexp function returns a value R, such that R = Value x 2**Exp.
              If a range error occurs, errno will be set to ERANGE.
**/
double  ldexp(double Value, int Exp);

/** Compute the natural logarithm of Arg.

    @param[in]    Arg   The value to compute the natural logarithm of.

    @return   The log function returns log base-e of Arg. If Arg is negative, errno is set to EDOM.
              Otherwise, errno will be set to ERANGE if a range error occurs.
**/
double  log(double Arg);

/** Compute the common (base-10) logarithm of Arg.

    @param[in]    Arg   The value to compute the common logarithm of.

    @return   The log10 function returns log base-10 of Arg. If Arg is negative, errno is set to EDOM.
              Otherwise, errno will be set to ERANGE if Arg is 0.
**/
double  log10(double Arg);

/** Compute the base-2 logarithm of Arg.

    @param[in]    Arg   The value to compute the base-2 logarithm of.

    @return   The log function returns log base-2 of Arg. If Arg is negative, errno is set to EDOM.
              Otherwise, errno will be set to ERANGE if Arg is 0.
**/
double  log2(double Arg);

/** Break Value into integral and fractional parts, each of which has the same type and sign
    as Value.  Store the integral part in the object pointed to by Integ and return the
    fractional part.

    @param[in]    Value   The value to compute the arc cosine of.
    @param[out]   Integ   Pointer to where the integral component is to be stored.

    @return   The fractional part of Value is returned directly while the integral part is
              returned in the location pointed to by Integ.
**/
double  modf(double Value, double *Integ);

/** Compute Value raised to the power Exp.

    @param[in]    Value   The value to be raised.
    @param[in]    Exp     The power Value is to be raised to.

    @return   The pow function returns Value**Exp.  If an error occurs, errno will be set as follows:
                - EDOM: Value is finite and negative and Exp is finite and not an integer.
                - EDOM: Both Value and Exp are zero.
                - EDOM: Value is zero and Exp is less than zero.
**/
double  pow(double Value, double Exp);

/** Compute the non-negative square root of Arg.

    @param[in]    Arg   The value to compute the square root of.

    @return   The square root of Arg.  If Arg is less than zero, errno is set to EDOM.
**/
double  sqrt(double Arg);


/** Compute the smallest integer value not less than Arg.

    @param[in]    Arg   The value to compute the ceiling of.

    @return   The ceiling of Arg expressed as a floating-point number.
**/
double  ceil(double Arg);

/** Compute the absolute value of Arg.

    @param[in]    Arg   The value to compute the absolute value of.

    @return   The absolute value of Arg.
**/
double  fabs(double Arg);

/** Compute the largest integer value not greater than Arg.

    @param[in]    Arg   The value to compute the floor of.

    @return   The largest integer value not greater than Arg, expressed as a floating-point number.
**/
double  floor(double);

/** Compute the floating-point remainder of A1 / A2.

    @param[in]    A1    The dividend.
    @param[in]    A2    The divisor.

    @return   The remainder of A1 / A2 with the same sign as A1.  If A2 is zero, the fmod function
              returns 0.
**/
double  fmod(double A1, double A2);


int finite(double);
double  expm1(double);

/**@{
    C99, Posix, or NetBSD functions that are not part of the C95 specification.
**/
/*
 * Functions callable from C, intended to support IEEE arithmetic.
 */
double  copysign(double, double);
double  scalbn(double, int);

/*
 * Library implementation
 */
int __fpclassifyf(float);
int __fpclassifyd(double);
int __isinff(float);
int __isinfd(double);
int __isnanf(float);
int __isnand(double);

#ifdef __HAVE_LONG_DOUBLE
  int __fpclassifyl(long double);
  int __isinfl(long double);
  int __isnanl(long double);
#endif  /* __HAVE_LONG_DOUBLE */
/*@}*/

__END_DECLS

/**@{
    Extensions provided by NetBSD but not required by the C95 standard.
**/
extern int signgam;

enum fdversion {fdlibm_ieee = -1, fdlibm_svid, fdlibm_xopen, fdlibm_posix};

#define _LIB_VERSION_TYPE enum fdversion
#define _LIB_VERSION _fdlib_version

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

#define _IEEE_  fdlibm_ieee
#define _SVID_  fdlibm_svid
#define _XOPEN_ fdlibm_xopen
#define _POSIX_ fdlibm_posix

#ifndef __cplusplus
struct exception {
  int type;
  char *name;
  double arg1;
  double arg2;
  double retval;
};
#endif

#define HUGE    MAXFLOAT

/** set X_TLOSS = pi*2**52 **/
#define X_TLOSS   1.41484755040568800000e+16

#define DOMAIN    1
#define SING      2
#define OVERFLOW  3
#define UNDERFLOW 4
#define TLOSS     5
#define PLOSS     6
/*@}*/

/* 7.12#4 INFINITY */
#ifdef __INFINITY
#define INFINITY  __INFINITY  /**< float constant which overflows */
#else
#define INFINITY  HUGE_VALF   /**< positive infinity */
#endif /* __INFINITY */

/* 7.12#5 NAN: a quiet NaN, if supported */
#ifdef __HAVE_NANF
extern const union __float_u __nanf;
#define NAN   __nanf.__val
#endif /* __HAVE_NANF */

/**@{
    C99 7.12#6 Number classification macros represent mutually exclusive kinds of floating-point
    values.
**/
#define FP_INFINITE   0x00
#define FP_NAN        0x01
#define FP_NORMAL     0x02
#define FP_SUBNORMAL  0x03
#define FP_ZERO       0x04
/* NetBSD extensions */
#define _FP_LOMD      0x80    /**< range for machine-specific classes */
#define _FP_HIMD      0xff
/*@)*/

/**@{
 * Constants ala XOPEN/SVID.
 */
#define M_E         2.7182818284590452354   /**< e */
#define M_LOG2E     1.4426950408889634074   /**< log 2e */
#define M_LOG10E    0.43429448190325182765  /**< log 10e */
#define M_LN2       0.69314718055994530942  /**< log e2 */
#define M_LN10      2.30258509299404568402  /**< log e10 */
#define M_PI        3.14159265358979323846  /**< pi */
#define M_PI_2      1.57079632679489661923  /**< pi/2 */
#define M_PI_4      0.78539816339744830962  /**< pi/4 */
#define M_1_PI      0.31830988618379067154  /**< 1/pi */
#define M_2_PI      0.63661977236758134308  /**< 2/pi */
#define M_2_SQRTPI  1.12837916709551257390  /**< 2/sqrt(pi) */
#define M_SQRT2     1.41421356237309504880  /**< sqrt(2) */
#define M_SQRT1_2   0.70710678118654752440  /**< 1/sqrt(2) */
#define MAXFLOAT  ((float)3.40282346638528860e+38)
/*@}*/

#endif /* _MATH_H_ */