/* * CDDL HEADER START * * The contents of this file are subject to the terms of the * Common Development and Distribution License, Version 1.0 only * (the "License"). You may not use this file except in compliance * with the License. * * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE * or http://www.opensolaris.org/os/licensing. * See the License for the specific language governing permissions * and limitations under the License. * * When distributing Covered Code, include this CDDL HEADER in each * file and include the License file at usr/src/OPENSOLARIS.LICENSE. * If applicable, add the following below this CDDL HEADER, with the * fields enclosed by brackets "[]" replaced with your own identifying * information: Portions Copyright [yyyy] [name of copyright owner] * * CDDL HEADER END */ /* * Copyright (c) 1988 by Sun Microsystems, Inc. */ /* Copyright (c) 1984 AT&T */ /* All Rights Reserved */ #pragma ident "%Z%%M% %I% %E% SMI" /* * Math library definitions for all the public functions implemented in libm.a. */ #ifndef __math_h #define __math_h /* * Posix (actually ansi C) section */ #define HUGE_VAL (__infinity()) /* Produces IEEE Infinity. */ extern double __infinity(); extern double acos(/* double x */); extern double asin(/* double x */); extern double atan(/* double x */); extern double atan2(/* double y, double x */); extern double ceil(/* double x */); extern double cos(/* double x */); extern double cosh(/* double x */); extern double exp(/* double x */); extern double fabs(/* double x */); extern double floor(/* double x */); extern double fmod(/* double x, double y */); extern double frexp(/* double value, int *exp */); extern double ldexp(/* double value, int exp */); extern double log(/* double x */); extern double log10(/* double x */); extern double modf(/* double value, double *iptr */); extern double pow(/* double x, double y */); extern double sin(/* double x */); extern double sinh(/* double x */); extern double sqrt(/* double x */); extern double tan(/* double x */); extern double tanh(/* double x */); #ifndef _POSIX_SOURCE /* the rest of the file is !POSIX */ #include /* Contains definitions for types and * functions implemented in libc.a. */ extern double acosh(); extern double asinh(); extern double atanh(); extern double cbrt(); extern double copysign(); extern double erf(); extern double erfc(); extern double expm1(); extern int finite(); extern double hypot(); extern double j0(); extern double j1(); extern double jn(); extern double lgamma(); extern double log1p(); extern double rint(); extern double y0(); extern double y1(); extern double yn(); /* * Sun definitions. */ /* * Implemented precisions for trigonometric argument reduction. */ enum fp_pi_type { fp_pi_infinite = 0, /* Infinite-precision approximation to pi. */ fp_pi_66 = 1, /* 66-bit approximation to pi. */ fp_pi_53 = 2 /* 53-bit approximation to pi. */ }; /* * Pi precision to use for trigonometric argument reduction. */ extern enum fp_pi_type fp_pi; /* * Functions callable from C, intended to support IEEE arithmetic. */ extern enum fp_class_type fp_class(); extern int ieee_flags(); extern int ieee_handler(); extern void ieee_retrospective(); extern int ilogb(); extern double infinity(); extern int irint(); extern int isinf(); extern int isnan(); extern int isnormal(); extern int issubnormal(); extern int iszero(); extern double logb(); extern double max_normal(); extern double max_subnormal(); extern double min_normal(); extern double min_subnormal(); extern double nextafter(); extern void nonstandard_arithmetic(); extern double quiet_nan(); extern double remainder(); extern double scalb(); extern double scalbn(); extern double signaling_nan(); extern int signbit(); extern double significand(); extern void standard_arithmetic(); /* * Other functions for C programmers. */ extern double acospi(); extern double aint(); extern double anint(); extern double annuity(); extern double asinpi(); extern double atan2pi(); extern double atanpi(); extern double compound(); extern double cospi(); extern double exp10(); extern double exp2(); extern double log2(); extern int nint(); extern void sincos(); extern void sincospi(); extern double sinpi(); extern double tanpi(); extern int matherr(); /* * Single-precision functions callable from Fortran, Pascal, Modula-2, etc, * take float* arguments instead of double and * return FLOATFUNCTIONTYPE results instead of double. * RETURNFLOAT is used to return a float function value without conversion * to double. * ASSIGNFLOAT is used to get the float value out of a FLOATFUNCTIONTYPE * result. * We don't want you to have to think about -fsingle2. * * Some internal library functions pass float parameters as 32-bit values, * disguised as FLOATPARAMETER. FLOATPARAMETERVALUE(x) extracts the * float value from the FLOATPARAMETER. */ /* mc68000 returns float results in d0, same as int */ #ifdef mc68000 #define FLOATFUNCTIONTYPE int #define RETURNFLOAT(x) return (*(int *)(&(x))) #define ASSIGNFLOAT(x,y) *(int *)(&x) = y #endif /* sparc returns float results in %f0, same as top half of double */ #ifdef sparc #define FLOATFUNCTIONTYPE double #define RETURNFLOAT(x) { union {double _d; float _f } _kluge; _kluge._f = (x); return _kluge._d; } #define ASSIGNFLOAT(x,y) { union {double _d; float _f } _kluge; _kluge._d = (y); x = _kluge._f; } #endif /* i386 returns float results on stack as extendeds, same as double */ #ifdef i386 #define FLOATFUNCTIONTYPE float #define RETURNFLOAT(x) return (x) #define ASSIGNFLOAT(x,y) x = y #endif /* So far everybody passes float parameters as 32 bits on stack, same as int. */ #define FLOATPARAMETER int #define FLOATPARAMETERVALUE(x) (*(float *)(&(x))) extern int ir_finite_(); extern enum fp_class_type ir_fp_class_(); extern int ir_ilogb_(); extern int ir_irint_(); extern int ir_isinf_(); extern int ir_isnan_(); extern int ir_isnormal_(); extern int ir_issubnormal_(); extern int ir_iszero_(); extern int ir_nint_(); extern int ir_signbit_(); extern void r_sincos_(); extern void r_sincospi_(); extern FLOATFUNCTIONTYPE r_acos_(); extern FLOATFUNCTIONTYPE r_acosh_(); extern FLOATFUNCTIONTYPE r_acospi_(); extern FLOATFUNCTIONTYPE r_aint_(); extern FLOATFUNCTIONTYPE r_anint_(); extern FLOATFUNCTIONTYPE r_annuity_(); extern FLOATFUNCTIONTYPE r_asin_(); extern FLOATFUNCTIONTYPE r_asinh_(); extern FLOATFUNCTIONTYPE r_asinpi_(); extern FLOATFUNCTIONTYPE r_atan2_(); extern FLOATFUNCTIONTYPE r_atan2pi_(); extern FLOATFUNCTIONTYPE r_atan_(); extern FLOATFUNCTIONTYPE r_atanh_(); extern FLOATFUNCTIONTYPE r_atanpi_(); extern FLOATFUNCTIONTYPE r_cbrt_(); extern FLOATFUNCTIONTYPE r_ceil_(); extern FLOATFUNCTIONTYPE r_compound_(); extern FLOATFUNCTIONTYPE r_copysign_(); extern FLOATFUNCTIONTYPE r_cos_(); extern FLOATFUNCTIONTYPE r_cosh_(); extern FLOATFUNCTIONTYPE r_cospi_(); extern FLOATFUNCTIONTYPE r_erf_(); extern FLOATFUNCTIONTYPE r_erfc_(); extern FLOATFUNCTIONTYPE r_exp10_(); extern FLOATFUNCTIONTYPE r_exp2_(); extern FLOATFUNCTIONTYPE r_exp_(); extern FLOATFUNCTIONTYPE r_expm1_(); extern FLOATFUNCTIONTYPE r_fabs_(); extern FLOATFUNCTIONTYPE r_floor_(); extern FLOATFUNCTIONTYPE r_fmod_(); extern FLOATFUNCTIONTYPE r_hypot_(); extern FLOATFUNCTIONTYPE r_infinity_(); extern FLOATFUNCTIONTYPE r_j0_(); extern FLOATFUNCTIONTYPE r_j1_(); extern FLOATFUNCTIONTYPE r_jn_(); extern FLOATFUNCTIONTYPE r_lgamma_(); extern FLOATFUNCTIONTYPE r_log10_(); extern FLOATFUNCTIONTYPE r_log1p_(); extern FLOATFUNCTIONTYPE r_log2_(); extern FLOATFUNCTIONTYPE r_log_(); extern FLOATFUNCTIONTYPE r_logb_(); extern FLOATFUNCTIONTYPE r_max_normal_(); extern FLOATFUNCTIONTYPE r_max_subnormal_(); extern FLOATFUNCTIONTYPE r_min_normal_(); extern FLOATFUNCTIONTYPE r_min_subnormal_(); extern FLOATFUNCTIONTYPE r_nextafter_(); extern FLOATFUNCTIONTYPE r_pow_(); extern FLOATFUNCTIONTYPE r_quiet_nan_(); extern FLOATFUNCTIONTYPE r_remainder_(); extern FLOATFUNCTIONTYPE r_rint_(); extern FLOATFUNCTIONTYPE r_scalb_(); extern FLOATFUNCTIONTYPE r_scalbn_(); extern FLOATFUNCTIONTYPE r_signaling_nan_(); extern FLOATFUNCTIONTYPE r_significand_(); extern FLOATFUNCTIONTYPE r_sin_(); extern FLOATFUNCTIONTYPE r_sinh_(); extern FLOATFUNCTIONTYPE r_sinpi_(); extern FLOATFUNCTIONTYPE r_sqrt_(); extern FLOATFUNCTIONTYPE r_tan_(); extern FLOATFUNCTIONTYPE r_tanh_(); extern FLOATFUNCTIONTYPE r_tanpi_(); extern FLOATFUNCTIONTYPE r_y0_(); extern FLOATFUNCTIONTYPE r_y1_(); extern FLOATFUNCTIONTYPE r_yn_(); /* Constants, variables, and functions from System V */ #define _ABS(x) ((x) < 0 ? -(x) : (x)) #define HUGE (infinity()) /* For historical compatibility. */ #define DOMAIN 1 #define SING 2 #define OVERFLOW 3 #define UNDERFLOW 4 #define TLOSS 5 #define PLOSS 6 struct exception { int type; char *name; double arg1; double arg2; double retval; }; /* * First three have to be defined exactly as in values.h including spacing! */ #define M_LN2 0.69314718055994530942 #define M_PI 3.14159265358979323846 #define M_SQRT2 1.41421356237309504880 #define M_E 2.7182818284590452354 #define M_LOG2E 1.4426950408889634074 #define M_LOG10E 0.43429448190325182765 #define M_LN10 2.30258509299404568402 #define M_PI_2 1.57079632679489661923 #define M_PI_4 0.78539816339744830962 #define M_1_PI 0.31830988618379067154 #define M_2_PI 0.63661977236758134308 #define M_2_SQRTPI 1.12837916709551257390 #define M_SQRT1_2 0.70710678118654752440 #define _REDUCE(TYPE, X, XN, C1, C2) { \ double x1 = (double)(TYPE)X, x2 = X - x1; \ X = x1 - (XN) * (C1); X += x2; X -= (XN) * (C2); } #define _POLY1(x, c) ((c)[0] * (x) + (c)[1]) #define _POLY2(x, c) (_POLY1((x), (c)) * (x) + (c)[2]) #define _POLY3(x, c) (_POLY2((x), (c)) * (x) + (c)[3]) #define _POLY4(x, c) (_POLY3((x), (c)) * (x) + (c)[4]) #define _POLY5(x, c) (_POLY4((x), (c)) * (x) + (c)[5]) #define _POLY6(x, c) (_POLY5((x), (c)) * (x) + (c)[6]) #define _POLY7(x, c) (_POLY6((x), (c)) * (x) + (c)[7]) #define _POLY8(x, c) (_POLY7((x), (c)) * (x) + (c)[8]) #define _POLY9(x, c) (_POLY8((x), (c)) * (x) + (c)[9]) extern int signgam; /* * Deprecated functions for compatibility with past. * Changes planned for future. */ extern double cabs(); /* Use double hypot(x,y) * Traditional cabs usage is confused - * is its argument two doubles or one struct? */ extern double drem(); /* Use double remainder(x,y) * drem will disappear in a future release. */ extern double gamma(); /* Use double lgamma(x) * to compute log of gamma function. * Name gamma is reserved for true gamma function * to appear in a future release. */ #endif /* !_POSIX_SOURCE */ #endif /* !__math_h */