1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
|
/*
* 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 <floatingpoint.h> /* 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 */
|