/** @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
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;
};
#ifdef __HAVE_LONG_DOUBLE
/* LINTED */ \
((sizeof (__arg0) == sizeof (float)) \
: (sizeof (__arg0) == sizeof (double)) \
#else
/* LINTED */ \
((sizeof (__arg0) == sizeof (float)) \
#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) */
/* C99 7.12.3.3 int isinf(real-floating x) */
#ifdef __isinf
#else
#endif
/* C99 7.12.3.4 int isnan(real-floating x) */
#ifdef __isnan
#else
#endif
/*@)*/
/*#############################################################
* ISO C95
*/
/**@{
Double, float, and long double versions, respectively, of HUGE_VAL.
*/
/*@)*/
/*
*/
/** 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.
**/
/** 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.
**/
/** 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.
**/
/** 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.
**/
/** 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.
**/
/** 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.
**/
/** 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.
**/
/** 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.
**/
/** 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.
**/
/** 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.
**/
/** 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.
**/
/** 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.
**/
/** 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.
**/
/** 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.
**/
/** 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.
**/
/** 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.
**/
/** 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.
**/
/** 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.
**/
/** 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.
**/
/** 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.
**/
/** Compute the absolute value of Arg.
@param[in] Arg The value to compute the absolute value of.
@return The absolute value of 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.
**/
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 */
/*@}*/
/**@{
Extensions provided by NetBSD but not required by the C95 standard.
**/
extern int signgam;
/** 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;
#ifndef __cplusplus
struct exception {
int type;
char *name;
double arg1;
double arg2;
double retval;
};
#endif
/** set X_TLOSS = pi*2**52 **/
/*@}*/
/* 7.12#4 INFINITY */
#ifdef __INFINITY
#else
#endif /* __INFINITY */
/* 7.12#5 NAN: a quiet NaN, if supported */
#ifdef __HAVE_NANF
#endif /* __HAVE_NANF */
/**@{
C99 7.12#6 Number classification macros represent mutually exclusive kinds of floating-point
values.
**/
/* NetBSD extensions */
/*@)*/
/**@{
*/
/*@}*/
#endif /* _MATH_H_ */