1*1e651e1eSRoland Levillain 2*1e651e1eSRoland Levillain /* @(#)fdlibm.h 1.5 04/04/22 */ 3*1e651e1eSRoland Levillain /* 4*1e651e1eSRoland Levillain * ==================================================== 5*1e651e1eSRoland Levillain * Copyright (C) 2004 by Sun Microsystems, Inc. All rights reserved. 6*1e651e1eSRoland Levillain * 7*1e651e1eSRoland Levillain * Permission to use, copy, modify, and distribute this 8*1e651e1eSRoland Levillain * software is freely granted, provided that this notice 9*1e651e1eSRoland Levillain * is preserved. 10*1e651e1eSRoland Levillain * ==================================================== 11*1e651e1eSRoland Levillain */ 12*1e651e1eSRoland Levillain 13*1e651e1eSRoland Levillain #ifdef __cplusplus 14*1e651e1eSRoland Levillain extern "C" { 15*1e651e1eSRoland Levillain #endif 16*1e651e1eSRoland Levillain 17*1e651e1eSRoland Levillain #ifndef __LITTLE_ENDIAN 18*1e651e1eSRoland Levillain /* Sometimes it's necessary to define __LITTLE_ENDIAN explicitly 19*1e651e1eSRoland Levillain but these catch some common cases. */ 20*1e651e1eSRoland Levillain #if defined(i386) || defined(i486) || \ 21*1e651e1eSRoland Levillain defined(intel) || defined(x86) || defined(i86pc) || \ 22*1e651e1eSRoland Levillain defined(__alpha) || defined(__osf__) || defined(__MIPSEL__) 23*1e651e1eSRoland Levillain #define __LITTLE_ENDIAN 24*1e651e1eSRoland Levillain #endif 25*1e651e1eSRoland Levillain #endif 26*1e651e1eSRoland Levillain 27*1e651e1eSRoland Levillain #ifdef __LITTLE_ENDIAN 28*1e651e1eSRoland Levillain #define __HI(x) *(1+(int*)&x) 29*1e651e1eSRoland Levillain #define __LO(x) *(int*)&x 30*1e651e1eSRoland Levillain #define __HIp(x) *(1+(int*)x) 31*1e651e1eSRoland Levillain #define __LOp(x) *(int*)x 32*1e651e1eSRoland Levillain #else 33*1e651e1eSRoland Levillain #define __HI(x) *(int*)&x 34*1e651e1eSRoland Levillain #define __LO(x) *(1+(int*)&x) 35*1e651e1eSRoland Levillain #define __HIp(x) *(int*)x 36*1e651e1eSRoland Levillain #define __LOp(x) *(1+(int*)x) 37*1e651e1eSRoland Levillain #endif 38*1e651e1eSRoland Levillain 39*1e651e1eSRoland Levillain #ifndef __P 40*1e651e1eSRoland Levillain #define __FDLIBM_P_DEFINED 41*1e651e1eSRoland Levillain #ifdef __STDC__ 42*1e651e1eSRoland Levillain #define __P(p) p 43*1e651e1eSRoland Levillain #else 44*1e651e1eSRoland Levillain #define __P(p) () 45*1e651e1eSRoland Levillain #endif 46*1e651e1eSRoland Levillain #endif 47*1e651e1eSRoland Levillain 48*1e651e1eSRoland Levillain /* 49*1e651e1eSRoland Levillain * ANSI/POSIX 50*1e651e1eSRoland Levillain */ 51*1e651e1eSRoland Levillain 52*1e651e1eSRoland Levillain extern int signgam; 53*1e651e1eSRoland Levillain 54*1e651e1eSRoland Levillain #define MAXFLOAT ((float)3.40282346638528860e+38) 55*1e651e1eSRoland Levillain 56*1e651e1eSRoland Levillain enum fdversion {fdlibm_ieee = -1, fdlibm_svid, fdlibm_xopen, fdlibm_posix}; 57*1e651e1eSRoland Levillain 58*1e651e1eSRoland Levillain #define _LIB_VERSION_TYPE enum fdversion 59*1e651e1eSRoland Levillain #define _LIB_VERSION _fdlib_version 60*1e651e1eSRoland Levillain 61*1e651e1eSRoland Levillain /* if global variable _LIB_VERSION is not desirable, one may 62*1e651e1eSRoland Levillain * change the following to be a constant by: 63*1e651e1eSRoland Levillain * #define _LIB_VERSION_TYPE const enum version 64*1e651e1eSRoland Levillain * In that case, after one initializes the value _LIB_VERSION (see 65*1e651e1eSRoland Levillain * s_lib_version.c) during compile time, it cannot be modified 66*1e651e1eSRoland Levillain * in the middle of a program 67*1e651e1eSRoland Levillain */ 68*1e651e1eSRoland Levillain extern _LIB_VERSION_TYPE _LIB_VERSION; 69*1e651e1eSRoland Levillain 70*1e651e1eSRoland Levillain #define _IEEE_ fdlibm_ieee 71*1e651e1eSRoland Levillain #define _SVID_ fdlibm_svid 72*1e651e1eSRoland Levillain #define _XOPEN_ fdlibm_xopen 73*1e651e1eSRoland Levillain #define _POSIX_ fdlibm_posix 74*1e651e1eSRoland Levillain 75*1e651e1eSRoland Levillain struct exception { 76*1e651e1eSRoland Levillain int type; 77*1e651e1eSRoland Levillain char *name; 78*1e651e1eSRoland Levillain double arg1; 79*1e651e1eSRoland Levillain double arg2; 80*1e651e1eSRoland Levillain double retval; 81*1e651e1eSRoland Levillain }; 82*1e651e1eSRoland Levillain 83*1e651e1eSRoland Levillain #define HUGE MAXFLOAT 84*1e651e1eSRoland Levillain 85*1e651e1eSRoland Levillain /* 86*1e651e1eSRoland Levillain * set X_TLOSS = pi*2**52, which is possibly defined in <values.h> 87*1e651e1eSRoland Levillain * (one may replace the following line by "#include <values.h>") 88*1e651e1eSRoland Levillain */ 89*1e651e1eSRoland Levillain 90*1e651e1eSRoland Levillain #define X_TLOSS 1.41484755040568800000e+16 91*1e651e1eSRoland Levillain 92*1e651e1eSRoland Levillain #define DOMAIN 1 93*1e651e1eSRoland Levillain #define SING 2 94*1e651e1eSRoland Levillain #define OVERFLOW 3 95*1e651e1eSRoland Levillain #define UNDERFLOW 4 96*1e651e1eSRoland Levillain #define TLOSS 5 97*1e651e1eSRoland Levillain #define PLOSS 6 98*1e651e1eSRoland Levillain 99*1e651e1eSRoland Levillain /* 100*1e651e1eSRoland Levillain * ANSI/POSIX 101*1e651e1eSRoland Levillain */ 102*1e651e1eSRoland Levillain extern double ieee_acos __P((double)); 103*1e651e1eSRoland Levillain extern double ieee_asin __P((double)); 104*1e651e1eSRoland Levillain extern double ieee_atan __P((double)); 105*1e651e1eSRoland Levillain extern double ieee_atan2 __P((double, double)); 106*1e651e1eSRoland Levillain extern double ieee_cos __P((double)); 107*1e651e1eSRoland Levillain extern double ieee_sin __P((double)); 108*1e651e1eSRoland Levillain extern double ieee_tan __P((double)); 109*1e651e1eSRoland Levillain 110*1e651e1eSRoland Levillain extern double ieee_cosh __P((double)); 111*1e651e1eSRoland Levillain extern double ieee_sinh __P((double)); 112*1e651e1eSRoland Levillain extern double ieee_tanh __P((double)); 113*1e651e1eSRoland Levillain 114*1e651e1eSRoland Levillain extern double ieee_exp __P((double)); 115*1e651e1eSRoland Levillain extern double ieee_frexp __P((double, int *)); 116*1e651e1eSRoland Levillain extern double ieee_ldexp __P((double, int)); 117*1e651e1eSRoland Levillain extern double ieee_log __P((double)); 118*1e651e1eSRoland Levillain extern double ieee_log10 __P((double)); 119*1e651e1eSRoland Levillain extern double ieee_modf __P((double, double *)); 120*1e651e1eSRoland Levillain 121*1e651e1eSRoland Levillain extern double ieee_pow __P((double, double)); 122*1e651e1eSRoland Levillain extern double ieee_sqrt __P((double)); 123*1e651e1eSRoland Levillain 124*1e651e1eSRoland Levillain extern double ieee_ceil __P((double)); 125*1e651e1eSRoland Levillain extern double ieee_fabs __P((double)); 126*1e651e1eSRoland Levillain extern double ieee_floor __P((double)); 127*1e651e1eSRoland Levillain extern double ieee_fmod __P((double, double)); 128*1e651e1eSRoland Levillain 129*1e651e1eSRoland Levillain extern double ieee_erf __P((double)); 130*1e651e1eSRoland Levillain extern double ieee_erfc __P((double)); 131*1e651e1eSRoland Levillain extern double ieee_gamma __P((double)); 132*1e651e1eSRoland Levillain extern double ieee_hypot __P((double, double)); 133*1e651e1eSRoland Levillain extern int ieee_isnan __P((double)); 134*1e651e1eSRoland Levillain extern int ieee_finite __P((double)); 135*1e651e1eSRoland Levillain extern double ieee_j0 __P((double)); 136*1e651e1eSRoland Levillain extern double ieee_j1 __P((double)); 137*1e651e1eSRoland Levillain extern double ieee_jn __P((int, double)); 138*1e651e1eSRoland Levillain extern double ieee_lgamma __P((double)); 139*1e651e1eSRoland Levillain extern double ieee_y0 __P((double)); 140*1e651e1eSRoland Levillain extern double ieee_y1 __P((double)); 141*1e651e1eSRoland Levillain extern double ieee_yn __P((int, double)); 142*1e651e1eSRoland Levillain 143*1e651e1eSRoland Levillain extern double acosh __P((double)); 144*1e651e1eSRoland Levillain extern double asinh __P((double)); 145*1e651e1eSRoland Levillain extern double atanh __P((double)); 146*1e651e1eSRoland Levillain extern double ieee_cbrt __P((double)); 147*1e651e1eSRoland Levillain extern double ieee_logb __P((double)); 148*1e651e1eSRoland Levillain extern double ieee_nextafter __P((double, double)); 149*1e651e1eSRoland Levillain extern double ieee_remainder __P((double, double)); 150*1e651e1eSRoland Levillain #ifdef _SCALB_INT 151*1e651e1eSRoland Levillain extern double ieee_scalb __P((double, int)); 152*1e651e1eSRoland Levillain #else 153*1e651e1eSRoland Levillain extern double ieee_scalb __P((double, double)); 154*1e651e1eSRoland Levillain #endif 155*1e651e1eSRoland Levillain 156*1e651e1eSRoland Levillain extern int ieee_matherr __P((struct exception *)); 157*1e651e1eSRoland Levillain 158*1e651e1eSRoland Levillain /* 159*1e651e1eSRoland Levillain * IEEE Test Vector 160*1e651e1eSRoland Levillain */ 161*1e651e1eSRoland Levillain extern double ieee_significand __P((double)); 162*1e651e1eSRoland Levillain 163*1e651e1eSRoland Levillain /* 164*1e651e1eSRoland Levillain * Functions callable from C, intended to support IEEE arithmetic. 165*1e651e1eSRoland Levillain */ 166*1e651e1eSRoland Levillain extern double ieee_copysign __P((double, double)); 167*1e651e1eSRoland Levillain extern int ieee_ilogb __P((double)); 168*1e651e1eSRoland Levillain extern double ieee_rint __P((double)); 169*1e651e1eSRoland Levillain extern double ieee_scalbn __P((double, int)); 170*1e651e1eSRoland Levillain 171*1e651e1eSRoland Levillain /* 172*1e651e1eSRoland Levillain * BSD math library entry points 173*1e651e1eSRoland Levillain */ 174*1e651e1eSRoland Levillain extern double ieee_expm1 __P((double)); 175*1e651e1eSRoland Levillain extern double ieee_log1p __P((double)); 176*1e651e1eSRoland Levillain 177*1e651e1eSRoland Levillain /* 178*1e651e1eSRoland Levillain * Reentrant version of gamma & lgamma; passes signgam back by reference 179*1e651e1eSRoland Levillain * as the second argument; user must allocate space for signgam. 180*1e651e1eSRoland Levillain */ 181*1e651e1eSRoland Levillain #ifdef _REENTRANT 182*1e651e1eSRoland Levillain extern double ieee_gamma_r __P((double, int *)); 183*1e651e1eSRoland Levillain extern double ieee_lgamma_r __P((double, int *)); 184*1e651e1eSRoland Levillain #endif /* _REENTRANT */ 185*1e651e1eSRoland Levillain 186*1e651e1eSRoland Levillain /* ieee style elementary functions */ 187*1e651e1eSRoland Levillain extern double __ieee754_sqrt __P((double)); 188*1e651e1eSRoland Levillain extern double __ieee754_acos __P((double)); 189*1e651e1eSRoland Levillain extern double __ieee754_acosh __P((double)); 190*1e651e1eSRoland Levillain extern double __ieee754_log __P((double)); 191*1e651e1eSRoland Levillain extern double __ieee754_atanh __P((double)); 192*1e651e1eSRoland Levillain extern double __ieee754_asin __P((double)); 193*1e651e1eSRoland Levillain extern double __ieee754_atan2 __P((double,double)); 194*1e651e1eSRoland Levillain extern double __ieee754_exp __P((double)); 195*1e651e1eSRoland Levillain extern double __ieee754_cosh __P((double)); 196*1e651e1eSRoland Levillain extern double __ieee754_fmod __P((double,double)); 197*1e651e1eSRoland Levillain extern double __ieee754_pow __P((double,double)); 198*1e651e1eSRoland Levillain extern double __ieee754_lgamma_r __P((double,int *)); 199*1e651e1eSRoland Levillain extern double __ieee754_gamma_r __P((double,int *)); 200*1e651e1eSRoland Levillain extern double __ieee754_lgamma __P((double)); 201*1e651e1eSRoland Levillain extern double __ieee754_gamma __P((double)); 202*1e651e1eSRoland Levillain extern double __ieee754_log10 __P((double)); 203*1e651e1eSRoland Levillain extern double __ieee754_sinh __P((double)); 204*1e651e1eSRoland Levillain extern double __ieee754_hypot __P((double,double)); 205*1e651e1eSRoland Levillain extern double __ieee754_j0 __P((double)); 206*1e651e1eSRoland Levillain extern double __ieee754_j1 __P((double)); 207*1e651e1eSRoland Levillain extern double __ieee754_y0 __P((double)); 208*1e651e1eSRoland Levillain extern double __ieee754_y1 __P((double)); 209*1e651e1eSRoland Levillain extern double __ieee754_jn __P((int,double)); 210*1e651e1eSRoland Levillain extern double __ieee754_yn __P((int,double)); 211*1e651e1eSRoland Levillain extern double __ieee754_remainder __P((double,double)); 212*1e651e1eSRoland Levillain extern int __ieee754_rem_pio2 __P((double,double*)); 213*1e651e1eSRoland Levillain #ifdef _SCALB_INT 214*1e651e1eSRoland Levillain extern double __ieee754_scalb __P((double,int)); 215*1e651e1eSRoland Levillain #else 216*1e651e1eSRoland Levillain extern double __ieee754_scalb __P((double,double)); 217*1e651e1eSRoland Levillain #endif 218*1e651e1eSRoland Levillain 219*1e651e1eSRoland Levillain /* fdlibm kernel function */ 220*1e651e1eSRoland Levillain extern double __kernel_standard __P((double,double,int)); 221*1e651e1eSRoland Levillain extern double __kernel_sin __P((double,double,int)); 222*1e651e1eSRoland Levillain extern double __kernel_cos __P((double,double)); 223*1e651e1eSRoland Levillain extern double __kernel_tan __P((double,double,int)); 224*1e651e1eSRoland Levillain extern int __kernel_rem_pio2 __P((double*,double*,int,int,int,const int*)); 225*1e651e1eSRoland Levillain 226*1e651e1eSRoland Levillain #ifdef __FDLIBM_P_DEFINED 227*1e651e1eSRoland Levillain #undef __P 228*1e651e1eSRoland Levillain #endif 229*1e651e1eSRoland Levillain 230*1e651e1eSRoland Levillain #ifdef __cplusplus 231*1e651e1eSRoland Levillain }; /* extern "C" */ 232*1e651e1eSRoland Levillain #endif 233