1 | /** @file
|
---|
2 | Floating-point Math functions and macros.
|
---|
3 |
|
---|
4 | Copyright (c) 2010 - 2011, Intel Corporation. All rights reserved.<BR>
|
---|
5 | This program and the accompanying materials are licensed and made available under
|
---|
6 | the terms and conditions of the BSD License that accompanies this distribution.
|
---|
7 | The full text of the license may be found at
|
---|
8 | http://opensource.org/licenses/bsd-license.
|
---|
9 |
|
---|
10 | THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
|
---|
11 | WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
|
---|
12 |
|
---|
13 | * ====================================================
|
---|
14 | * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
|
---|
15 | *
|
---|
16 | * Developed at SunPro, a Sun Microsystems, Inc. business.
|
---|
17 | * Permission to use, copy, modify, and distribute this
|
---|
18 | * software is freely granted, provided that this notice
|
---|
19 | * is preserved.
|
---|
20 | * ====================================================
|
---|
21 |
|
---|
22 | NetBSD: math.h,v 1.44 2006/03/25 16:41:11 xtraeme Exp
|
---|
23 | dlibm.h 5.1 93/09/24
|
---|
24 | **/
|
---|
25 | #ifndef _MATH_H_
|
---|
26 | #define _MATH_H_
|
---|
27 |
|
---|
28 | #include <sys/EfiCdefs.h>
|
---|
29 | #include <sys/featuretest.h>
|
---|
30 |
|
---|
31 | /** @{
|
---|
32 | @brief These are forward references to unions and macros used internaly
|
---|
33 | by the implementation of the math functions and macros.
|
---|
34 | **/
|
---|
35 | union __float_u {
|
---|
36 | unsigned char __dummy[sizeof(float)];
|
---|
37 | float __val;
|
---|
38 | };
|
---|
39 |
|
---|
40 | union __double_u {
|
---|
41 | unsigned char __dummy[sizeof(double)];
|
---|
42 | double __val;
|
---|
43 | };
|
---|
44 |
|
---|
45 | union __long_double_u {
|
---|
46 | unsigned char __dummy[sizeof(long double)];
|
---|
47 | long double __val;
|
---|
48 | };
|
---|
49 |
|
---|
50 | #include <machine/math.h> /* may use __float_u, __double_u, or __long_double_u */
|
---|
51 |
|
---|
52 | #ifdef __HAVE_LONG_DOUBLE
|
---|
53 | #define __fpmacro_unary_floating(__name, __arg0) \
|
---|
54 | /* LINTED */ \
|
---|
55 | ((sizeof (__arg0) == sizeof (float)) \
|
---|
56 | ? __ ## __name ## f (__arg0) \
|
---|
57 | : (sizeof (__arg0) == sizeof (double)) \
|
---|
58 | ? __ ## __name ## d (__arg0) \
|
---|
59 | : __ ## __name ## l (__arg0))
|
---|
60 | #else
|
---|
61 | #define __fpmacro_unary_floating(__name, __arg0) \
|
---|
62 | /* LINTED */ \
|
---|
63 | ((sizeof (__arg0) == sizeof (float)) \
|
---|
64 | ? __ ## __name ## f (__arg0) \
|
---|
65 | : __ ## __name ## d (__arg0))
|
---|
66 | #endif /* __HAVE_LONG_DOUBLE */
|
---|
67 |
|
---|
68 | extern const union __double_u __infinity;
|
---|
69 | extern const union __float_u __infinityf;
|
---|
70 | extern const union __long_double_u __infinityl;
|
---|
71 |
|
---|
72 | /* C99 7.12.3.1 int fpclassify(real-floating x) */
|
---|
73 | #define fpclassify(__x) __fpmacro_unary_floating(fpclassify, __x)
|
---|
74 |
|
---|
75 | /* C99 7.12.3.3 int isinf(real-floating x) */
|
---|
76 | #ifdef __isinf
|
---|
77 | #define isinf(__x) __isinf(__x)
|
---|
78 | #else
|
---|
79 | #define isinf(__x) __fpmacro_unary_floating(isinf, __x)
|
---|
80 | #endif
|
---|
81 |
|
---|
82 | /* C99 7.12.3.4 int isnan(real-floating x) */
|
---|
83 | #ifdef __isnan
|
---|
84 | #define isnan(__x) __isnan(__x)
|
---|
85 | #else
|
---|
86 | #define isnan(__x) __fpmacro_unary_floating(isnan, __x)
|
---|
87 | #endif
|
---|
88 | /*@)*/
|
---|
89 |
|
---|
90 | /*#############################################################
|
---|
91 | * ISO C95
|
---|
92 | */
|
---|
93 |
|
---|
94 | /**@{
|
---|
95 | Double, float, and long double versions, respectively, of HUGE_VAL.
|
---|
96 | */
|
---|
97 | #define HUGE_VAL __infinity.__val
|
---|
98 | #define HUGE_VALF __infinityf.__val
|
---|
99 | #define HUGE_VALL __infinityl.__val
|
---|
100 | /*@)*/
|
---|
101 |
|
---|
102 | __BEGIN_DECLS
|
---|
103 | /*
|
---|
104 | * ANSI/POSIX
|
---|
105 | */
|
---|
106 | /** Compute the principal value of the arc cosine of Arg.
|
---|
107 |
|
---|
108 | @param[in] Arg The value to compute the arc cosine of.
|
---|
109 |
|
---|
110 | @return The computed value of the arc cosine of Arg in the interval [0,pi] radians.
|
---|
111 | If Arg is not in the interval [-1,+1], errno is set to EDOM.
|
---|
112 | **/
|
---|
113 | double acos(double Arg);
|
---|
114 |
|
---|
115 | /** Compute the principal value of the arc sine of Arg.
|
---|
116 |
|
---|
117 | @param[in] Arg The value to compute the arc sine of.
|
---|
118 |
|
---|
119 | @return The computed value of the arc sine of Arg in the interval [-pi/2,+pi/2] radians.
|
---|
120 | If Arg is not in the interval [-1,+1], errno is set to EDOM.
|
---|
121 | **/
|
---|
122 | double asin(double Arg);
|
---|
123 |
|
---|
124 | /** Compute the principal value of the arc tangent of Arg.
|
---|
125 |
|
---|
126 | @param[in] Arg The value to compute the arc tangent of.
|
---|
127 |
|
---|
128 | @return The computed value of the arc tangent of Arg in the interval [-pi/2,+pi/2] radians.
|
---|
129 | **/
|
---|
130 | double atan(double Arg);
|
---|
131 |
|
---|
132 | /** Compute the value of the arc tangent of (Num / Denom).
|
---|
133 | The sign of both arguments is used to determine the quadrant of the return value.
|
---|
134 |
|
---|
135 | @param[in] Num The numerator of the value to compute the arc tangent of.
|
---|
136 | @param[in] Denom The denominator of the value to compute the arc tangent of.
|
---|
137 |
|
---|
138 | @return The computed value of the arc tangent of (Num / Denom) in the interval [-pi,+pi] radians.
|
---|
139 | **/
|
---|
140 | double atan2(double Num, double Denom);
|
---|
141 |
|
---|
142 | /** Compute the value of the cosine of Arg, measured in radians.
|
---|
143 |
|
---|
144 | @param[in] Arg The value to compute the cosine of.
|
---|
145 |
|
---|
146 | @return The computed value of the cosine of Arg.
|
---|
147 | **/
|
---|
148 | double cos(double Arg);
|
---|
149 |
|
---|
150 | /** Compute the value of the sine of Arg.
|
---|
151 |
|
---|
152 | @param[in] Arg The value to compute the sine of.
|
---|
153 |
|
---|
154 | @return The computed value of the sine of Arg.
|
---|
155 | **/
|
---|
156 | double sin(double Arg);
|
---|
157 |
|
---|
158 | /** Compute the value of the tangent of Arg.
|
---|
159 |
|
---|
160 | @param[in] Arg The value to compute the tangent of.
|
---|
161 |
|
---|
162 | @return The computed value of the tangent of Arg.
|
---|
163 | **/
|
---|
164 | double tan(double Arg);
|
---|
165 |
|
---|
166 |
|
---|
167 | /** Compute the value of the hyperbolic cosine of Arg.
|
---|
168 |
|
---|
169 | @param[in] Arg The value to compute the hyperbolic cosine of.
|
---|
170 |
|
---|
171 | @return The computed value of the hyperbolic cosine of Arg.
|
---|
172 | If the magnitude of Arg is too large, errno is set to ERANGE.
|
---|
173 | **/
|
---|
174 | double cosh(double Arg);
|
---|
175 |
|
---|
176 | /** Compute the value of the hyperbolic sine of Arg.
|
---|
177 |
|
---|
178 | @param[in] Arg The value to compute the hyperbolic sine of.
|
---|
179 |
|
---|
180 | @return The computed value of the hyperbolic sine of Arg.
|
---|
181 | If the magnitude of Arg is too large, errno is set to ERANGE.
|
---|
182 | **/
|
---|
183 | double sinh(double Arg);
|
---|
184 |
|
---|
185 | /** Compute the value of the hyperbolic tangent of Arg.
|
---|
186 |
|
---|
187 | @param[in] Arg The value to compute the hyperbolic tangent of.
|
---|
188 |
|
---|
189 | @return The computed value of the hyperbolic tangent of Arg.
|
---|
190 | **/
|
---|
191 | double tanh(double Arg);
|
---|
192 |
|
---|
193 |
|
---|
194 | /** Compute the base-e exponential of Arg.
|
---|
195 |
|
---|
196 | @param[in] Arg The value to compute the base-e exponential of.
|
---|
197 |
|
---|
198 | @return The computed value of e**Arg.
|
---|
199 | If the magnitude of Arg is too large, errno is set to ERANGE.
|
---|
200 | **/
|
---|
201 | double exp(double Arg);
|
---|
202 |
|
---|
203 | /** Break a floating-point number into a normalized fraction and an integral power of 2.
|
---|
204 |
|
---|
205 | @param[in] Value The floating-point value to be broken down.
|
---|
206 | @param[out] Exp A pointer to an integer object to receive the integral power of 2 exponent.
|
---|
207 |
|
---|
208 | @return The frexp function returns a value R, such that Value == R**Exp.
|
---|
209 | If Value is zero, both parts of the result are zero.
|
---|
210 | **/
|
---|
211 | double frexp(double Value, int *Exp);
|
---|
212 |
|
---|
213 | /** Multiply a floating-point number, Value, by an integral power of 2, Exp.
|
---|
214 |
|
---|
215 | @param[in] Value The floating-point value to be multiplied.
|
---|
216 | @param[out] Exp The integral power of 2 to multiply Value by.
|
---|
217 |
|
---|
218 | @return The ldexp function returns a value R, such that R = Value x 2**Exp.
|
---|
219 | If a range error occurs, errno will be set to ERANGE.
|
---|
220 | **/
|
---|
221 | double ldexp(double Value, int Exp);
|
---|
222 |
|
---|
223 | /** Compute the natural logarithm of Arg.
|
---|
224 |
|
---|
225 | @param[in] Arg The value to compute the natural logarithm of.
|
---|
226 |
|
---|
227 | @return The log function returns log base-e of Arg. If Arg is negative, errno is set to EDOM.
|
---|
228 | Otherwise, errno will be set to ERANGE if a range error occurs.
|
---|
229 | **/
|
---|
230 | double log(double Arg);
|
---|
231 |
|
---|
232 | /** Compute the common (base-10) logarithm of Arg.
|
---|
233 |
|
---|
234 | @param[in] Arg The value to compute the common logarithm of.
|
---|
235 |
|
---|
236 | @return The log10 function returns log base-10 of Arg. If Arg is negative, errno is set to EDOM.
|
---|
237 | Otherwise, errno will be set to ERANGE if Arg is 0.
|
---|
238 | **/
|
---|
239 | double log10(double Arg);
|
---|
240 |
|
---|
241 | /** Compute the base-2 logarithm of Arg.
|
---|
242 |
|
---|
243 | @param[in] Arg The value to compute the base-2 logarithm of.
|
---|
244 |
|
---|
245 | @return The log function returns log base-2 of Arg. If Arg is negative, errno is set to EDOM.
|
---|
246 | Otherwise, errno will be set to ERANGE if Arg is 0.
|
---|
247 | **/
|
---|
248 | double log2(double Arg);
|
---|
249 |
|
---|
250 | /** Break Value into integral and fractional parts, each of which has the same type and sign
|
---|
251 | as Value. Store the integral part in the object pointed to by Integ and return the
|
---|
252 | fractional part.
|
---|
253 |
|
---|
254 | @param[in] Value The value to compute the arc cosine of.
|
---|
255 | @param[out] Integ Pointer to where the integral component is to be stored.
|
---|
256 |
|
---|
257 | @return The fractional part of Value is returned directly while the integral part is
|
---|
258 | returned in the location pointed to by Integ.
|
---|
259 | **/
|
---|
260 | double modf(double Value, double *Integ);
|
---|
261 |
|
---|
262 | /** Compute Value raised to the power Exp.
|
---|
263 |
|
---|
264 | @param[in] Value The value to be raised.
|
---|
265 | @param[in] Exp The power Value is to be raised to.
|
---|
266 |
|
---|
267 | @return The pow function returns Value**Exp. If an error occurs, errno will be set as follows:
|
---|
268 | - EDOM: Value is finite and negative and Exp is finite and not an integer.
|
---|
269 | - EDOM: Both Value and Exp are zero.
|
---|
270 | - EDOM: Value is zero and Exp is less than zero.
|
---|
271 | **/
|
---|
272 | double pow(double Value, double Exp);
|
---|
273 |
|
---|
274 | /** Compute the non-negative square root of Arg.
|
---|
275 |
|
---|
276 | @param[in] Arg The value to compute the square root of.
|
---|
277 |
|
---|
278 | @return The square root of Arg. If Arg is less than zero, errno is set to EDOM.
|
---|
279 | **/
|
---|
280 | double sqrt(double Arg);
|
---|
281 |
|
---|
282 |
|
---|
283 | /** Compute the smallest integer value not less than Arg.
|
---|
284 |
|
---|
285 | @param[in] Arg The value to compute the ceiling of.
|
---|
286 |
|
---|
287 | @return The ceiling of Arg expressed as a floating-point number.
|
---|
288 | **/
|
---|
289 | double ceil(double Arg);
|
---|
290 |
|
---|
291 | /** Compute the absolute value of Arg.
|
---|
292 |
|
---|
293 | @param[in] Arg The value to compute the absolute value of.
|
---|
294 |
|
---|
295 | @return The absolute value of Arg.
|
---|
296 | **/
|
---|
297 | double fabs(double Arg);
|
---|
298 |
|
---|
299 | /** Compute the largest integer value not greater than Arg.
|
---|
300 |
|
---|
301 | @param[in] Arg The value to compute the floor of.
|
---|
302 |
|
---|
303 | @return The largest integer value not greater than Arg, expressed as a floating-point number.
|
---|
304 | **/
|
---|
305 | double floor(double);
|
---|
306 |
|
---|
307 | /** Compute the floating-point remainder of A1 / A2.
|
---|
308 |
|
---|
309 | @param[in] A1 The dividend.
|
---|
310 | @param[in] A2 The divisor.
|
---|
311 |
|
---|
312 | @return The remainder of A1 / A2 with the same sign as A1. If A2 is zero, the fmod function
|
---|
313 | returns 0.
|
---|
314 | **/
|
---|
315 | double fmod(double A1, double A2);
|
---|
316 |
|
---|
317 |
|
---|
318 | int finite(double);
|
---|
319 | double expm1(double);
|
---|
320 |
|
---|
321 | /**@{
|
---|
322 | C99, Posix, or NetBSD functions that are not part of the C95 specification.
|
---|
323 | **/
|
---|
324 | /*
|
---|
325 | * Functions callable from C, intended to support IEEE arithmetic.
|
---|
326 | */
|
---|
327 | double copysign(double, double);
|
---|
328 | double scalbn(double, int);
|
---|
329 |
|
---|
330 | /*
|
---|
331 | * Library implementation
|
---|
332 | */
|
---|
333 | int __fpclassifyf(float);
|
---|
334 | int __fpclassifyd(double);
|
---|
335 | int __isinff(float);
|
---|
336 | int __isinfd(double);
|
---|
337 | int __isnanf(float);
|
---|
338 | int __isnand(double);
|
---|
339 |
|
---|
340 | #ifdef __HAVE_LONG_DOUBLE
|
---|
341 | int __fpclassifyl(long double);
|
---|
342 | int __isinfl(long double);
|
---|
343 | int __isnanl(long double);
|
---|
344 | #endif /* __HAVE_LONG_DOUBLE */
|
---|
345 | /*@}*/
|
---|
346 |
|
---|
347 | __END_DECLS
|
---|
348 |
|
---|
349 | /**@{
|
---|
350 | Extensions provided by NetBSD but not required by the C95 standard.
|
---|
351 | **/
|
---|
352 | extern int signgam;
|
---|
353 |
|
---|
354 | enum fdversion {fdlibm_ieee = -1, fdlibm_svid, fdlibm_xopen, fdlibm_posix};
|
---|
355 |
|
---|
356 | #define _LIB_VERSION_TYPE enum fdversion
|
---|
357 | #define _LIB_VERSION _fdlib_version
|
---|
358 |
|
---|
359 | /** If global variable _LIB_VERSION is not desirable, one may
|
---|
360 | * change the following to be a constant by:
|
---|
361 | * #define _LIB_VERSION_TYPE const enum version
|
---|
362 | * In that case, after one initializes the value _LIB_VERSION (see
|
---|
363 | * s_lib_version.c) during compile time, it cannot be modified
|
---|
364 | * in the middle of a program
|
---|
365 | */
|
---|
366 | extern _LIB_VERSION_TYPE _LIB_VERSION;
|
---|
367 |
|
---|
368 | #define _IEEE_ fdlibm_ieee
|
---|
369 | #define _SVID_ fdlibm_svid
|
---|
370 | #define _XOPEN_ fdlibm_xopen
|
---|
371 | #define _POSIX_ fdlibm_posix
|
---|
372 |
|
---|
373 | #ifndef __cplusplus
|
---|
374 | struct exception {
|
---|
375 | int type;
|
---|
376 | char *name;
|
---|
377 | double arg1;
|
---|
378 | double arg2;
|
---|
379 | double retval;
|
---|
380 | };
|
---|
381 | #endif
|
---|
382 |
|
---|
383 | #define HUGE MAXFLOAT
|
---|
384 |
|
---|
385 | /** set X_TLOSS = pi*2**52 **/
|
---|
386 | #define X_TLOSS 1.41484755040568800000e+16
|
---|
387 |
|
---|
388 | #define DOMAIN 1
|
---|
389 | #define SING 2
|
---|
390 | #define OVERFLOW 3
|
---|
391 | #define UNDERFLOW 4
|
---|
392 | #define TLOSS 5
|
---|
393 | #define PLOSS 6
|
---|
394 | /*@}*/
|
---|
395 |
|
---|
396 | /* 7.12#4 INFINITY */
|
---|
397 | #ifdef __INFINITY
|
---|
398 | #define INFINITY __INFINITY /**< float constant which overflows */
|
---|
399 | #else
|
---|
400 | #define INFINITY HUGE_VALF /**< positive infinity */
|
---|
401 | #endif /* __INFINITY */
|
---|
402 |
|
---|
403 | /* 7.12#5 NAN: a quiet NaN, if supported */
|
---|
404 | #ifdef __HAVE_NANF
|
---|
405 | extern const union __float_u __nanf;
|
---|
406 | #define NAN __nanf.__val
|
---|
407 | #endif /* __HAVE_NANF */
|
---|
408 |
|
---|
409 | /**@{
|
---|
410 | C99 7.12#6 Number classification macros represent mutually exclusive kinds of floating-point
|
---|
411 | values.
|
---|
412 | **/
|
---|
413 | #define FP_INFINITE 0x00
|
---|
414 | #define FP_NAN 0x01
|
---|
415 | #define FP_NORMAL 0x02
|
---|
416 | #define FP_SUBNORMAL 0x03
|
---|
417 | #define FP_ZERO 0x04
|
---|
418 | /* NetBSD extensions */
|
---|
419 | #define _FP_LOMD 0x80 /**< range for machine-specific classes */
|
---|
420 | #define _FP_HIMD 0xff
|
---|
421 | /*@)*/
|
---|
422 |
|
---|
423 | /**@{
|
---|
424 | * Constants ala XOPEN/SVID.
|
---|
425 | */
|
---|
426 | #define M_E 2.7182818284590452354 /**< e */
|
---|
427 | #define M_LOG2E 1.4426950408889634074 /**< log 2e */
|
---|
428 | #define M_LOG10E 0.43429448190325182765 /**< log 10e */
|
---|
429 | #define M_LN2 0.69314718055994530942 /**< log e2 */
|
---|
430 | #define M_LN10 2.30258509299404568402 /**< log e10 */
|
---|
431 | #define M_PI 3.14159265358979323846 /**< pi */
|
---|
432 | #define M_PI_2 1.57079632679489661923 /**< pi/2 */
|
---|
433 | #define M_PI_4 0.78539816339744830962 /**< pi/4 */
|
---|
434 | #define M_1_PI 0.31830988618379067154 /**< 1/pi */
|
---|
435 | #define M_2_PI 0.63661977236758134308 /**< 2/pi */
|
---|
436 | #define M_2_SQRTPI 1.12837916709551257390 /**< 2/sqrt(pi) */
|
---|
437 | #define M_SQRT2 1.41421356237309504880 /**< sqrt(2) */
|
---|
438 | #define M_SQRT1_2 0.70710678118654752440 /**< 1/sqrt(2) */
|
---|
439 | #define MAXFLOAT ((float)3.40282346638528860e+38)
|
---|
440 | /*@}*/
|
---|
441 |
|
---|
442 | #endif /* _MATH_H_ */
|
---|