mirror of
				https://git.proxmox.com/git/mirror_edk2
				synced 2025-10-31 13:02:07 +00:00 
			
		
		
		
	 a430bdb132
			
		
	
	
		a430bdb132
		
	
	
	
	
		
			
			git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@12139 6f19259b-4bc3-4df7-8a09-765794883524
		
			
				
	
	
		
			443 lines
		
	
	
		
			14 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			443 lines
		
	
	
		
			14 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| /** @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_ */
 |