Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(132)

Side by Side Diff: gcc/libgfortran/intrinsics/c99_functions.c

Issue 3050029: [gcc] GCC 4.5.0=>4.5.1 (Closed) Base URL: ssh://git@gitrw.chromium.org:9222/nacl-toolchain.git
Patch Set: Created 10 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « gcc/libgfortran/intrinsics/args.c ('k') | gcc/libgfortran/intrinsics/cshift0.c » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 /* Implementation of various C99 functions 1 /* Implementation of various C99 functions
2 Copyright (C) 2004, 2009 Free Software Foundation, Inc. 2 Copyright (C) 2004, 2009 Free Software Foundation, Inc.
3 3
4 This file is part of the GNU Fortran 95 runtime library (libgfortran). 4 This file is part of the GNU Fortran 95 runtime library (libgfortran).
5 5
6 Libgfortran is free software; you can redistribute it and/or 6 Libgfortran is free software; you can redistribute it and/or
7 modify it under the terms of the GNU General Public 7 modify it under the terms of the GNU General Public
8 License as published by the Free Software Foundation; either 8 License as published by the Free Software Foundation; either
9 version 3 of the License, or (at your option) any later version. 9 version 3 of the License, or (at your option) any later version.
10 10
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after
47 47
48 #ifdef __osf__ 48 #ifdef __osf__
49 #undef HAVE_CABS 49 #undef HAVE_CABS
50 #undef HAVE_CABSF 50 #undef HAVE_CABSF
51 #undef HAVE_CABSL 51 #undef HAVE_CABSL
52 #define cabs __gfc_cabs 52 #define cabs __gfc_cabs
53 #define cabsf __gfc_cabsf 53 #define cabsf __gfc_cabsf
54 #define cabsl __gfc_cabsl 54 #define cabsl __gfc_cabsl
55 #endif 55 #endif
56 56
57 /* Prototypes to silence -Wstrict-prototypes -Wmissing-prototypes. */ 57 /* On a C99 system "I" (with I*I = -1) should be defined in complex.h;
58 if not, we define a fallback version here. */
59 #ifndef I
60 # if defined(_Imaginary_I)
61 # define I _Imaginary_I
62 # elif defined(_Complex_I)
63 # define I _Complex_I
64 # else
65 # define I (1.0fi)
66 # endif
67 #endif
58 68
59 float cabsf(float complex); 69 /* Prototypes are included to silence -Wstrict-prototypes
60 double cabs(double complex); 70 -Wmissing-prototypes. */
61 long double cabsl(long double complex);
62
63 float cargf(float complex);
64 double carg(double complex);
65 long double cargl(long double complex);
66
67 float complex clog10f(float complex);
68 double complex clog10(double complex);
69 long double complex clog10l(long double complex);
70 71
71 72
72 /* Wrappers for systems without the various C99 single precision Bessel 73 /* Wrappers for systems without the various C99 single precision Bessel
73 functions. */ 74 functions. */
74 75
75 #if defined(HAVE_J0) && ! defined(HAVE_J0F) 76 #if defined(HAVE_J0) && ! defined(HAVE_J0F)
76 #define HAVE_J0F 1 77 #define HAVE_J0F 1
77 extern float j0f (float); 78 float j0f (float);
78 79
79 float 80 float
80 j0f (float x) 81 j0f (float x)
81 { 82 {
82 return (float) j0 ((double) x); 83 return (float) j0 ((double) x);
83 } 84 }
84 #endif 85 #endif
85 86
86 #if defined(HAVE_J1) && !defined(HAVE_J1F) 87 #if defined(HAVE_J1) && !defined(HAVE_J1F)
87 #define HAVE_J1F 1 88 #define HAVE_J1F 1
88 extern float j1f (float); 89 float j1f (float);
89 90
90 float j1f (float x) 91 float j1f (float x)
91 { 92 {
92 return (float) j1 ((double) x); 93 return (float) j1 ((double) x);
93 } 94 }
94 #endif 95 #endif
95 96
96 #if defined(HAVE_JN) && !defined(HAVE_JNF) 97 #if defined(HAVE_JN) && !defined(HAVE_JNF)
97 #define HAVE_JNF 1 98 #define HAVE_JNF 1
98 extern float jnf (int, float); 99 float jnf (int, float);
99 100
100 float 101 float
101 jnf (int n, float x) 102 jnf (int n, float x)
102 { 103 {
103 return (float) jn (n, (double) x); 104 return (float) jn (n, (double) x);
104 } 105 }
105 #endif 106 #endif
106 107
107 #if defined(HAVE_Y0) && !defined(HAVE_Y0F) 108 #if defined(HAVE_Y0) && !defined(HAVE_Y0F)
108 #define HAVE_Y0F 1 109 #define HAVE_Y0F 1
109 extern float y0f (float); 110 float y0f (float);
110 111
111 float 112 float
112 y0f (float x) 113 y0f (float x)
113 { 114 {
114 return (float) y0 ((double) x); 115 return (float) y0 ((double) x);
115 } 116 }
116 #endif 117 #endif
117 118
118 #if defined(HAVE_Y1) && !defined(HAVE_Y1F) 119 #if defined(HAVE_Y1) && !defined(HAVE_Y1F)
119 #define HAVE_Y1F 1 120 #define HAVE_Y1F 1
120 extern float y1f (float); 121 float y1f (float);
121 122
122 float 123 float
123 y1f (float x) 124 y1f (float x)
124 { 125 {
125 return (float) y1 ((double) x); 126 return (float) y1 ((double) x);
126 } 127 }
127 #endif 128 #endif
128 129
129 #if defined(HAVE_YN) && !defined(HAVE_YNF) 130 #if defined(HAVE_YN) && !defined(HAVE_YNF)
130 #define HAVE_YNF 1 131 #define HAVE_YNF 1
131 extern float ynf (int, float); 132 float ynf (int, float);
132 133
133 float 134 float
134 ynf (int n, float x) 135 ynf (int n, float x)
135 { 136 {
136 return (float) yn (n, (double) x); 137 return (float) yn (n, (double) x);
137 } 138 }
138 #endif 139 #endif
139 140
140 141
141 /* Wrappers for systems without the C99 erff() and erfcf() functions. */ 142 /* Wrappers for systems without the C99 erff() and erfcf() functions. */
142 143
143 #if defined(HAVE_ERF) && !defined(HAVE_ERFF) 144 #if defined(HAVE_ERF) && !defined(HAVE_ERFF)
144 #define HAVE_ERFF 1 145 #define HAVE_ERFF 1
145 extern float erff (float); 146 float erff (float);
146 147
147 float 148 float
148 erff (float x) 149 erff (float x)
149 { 150 {
150 return (float) erf ((double) x); 151 return (float) erf ((double) x);
151 } 152 }
152 #endif 153 #endif
153 154
154 #if defined(HAVE_ERFC) && !defined(HAVE_ERFCF) 155 #if defined(HAVE_ERFC) && !defined(HAVE_ERFCF)
155 #define HAVE_ERFCF 1 156 #define HAVE_ERFCF 1
156 extern float erfcf (float); 157 float erfcf (float);
157 158
158 float 159 float
159 erfcf (float x) 160 erfcf (float x)
160 { 161 {
161 return (float) erfc ((double) x); 162 return (float) erfc ((double) x);
162 } 163 }
163 #endif 164 #endif
164 165
165 166
166 #ifndef HAVE_ACOSF 167 #ifndef HAVE_ACOSF
167 #define HAVE_ACOSF 1 168 #define HAVE_ACOSF 1
169 float acosf (float x);
170
168 float 171 float
169 acosf(float x) 172 acosf (float x)
170 { 173 {
171 return (float) acos(x); 174 return (float) acos (x);
172 } 175 }
173 #endif 176 #endif
174 177
175 #if HAVE_ACOSH && !HAVE_ACOSHF 178 #if HAVE_ACOSH && !HAVE_ACOSHF
179 float acoshf (float x);
180
176 float 181 float
177 acoshf (float x) 182 acoshf (float x)
178 { 183 {
179 return (float) acosh ((double) x); 184 return (float) acosh ((double) x);
180 } 185 }
181 #endif 186 #endif
182 187
183 #ifndef HAVE_ASINF 188 #ifndef HAVE_ASINF
184 #define HAVE_ASINF 1 189 #define HAVE_ASINF 1
190 float asinf (float x);
191
185 float 192 float
186 asinf(float x) 193 asinf (float x)
187 { 194 {
188 return (float) asin(x); 195 return (float) asin (x);
189 } 196 }
190 #endif 197 #endif
191 198
192 #if HAVE_ASINH && !HAVE_ASINHF 199 #if HAVE_ASINH && !HAVE_ASINHF
200 float asinhf (float x);
201
193 float 202 float
194 asinhf (float x) 203 asinhf (float x)
195 { 204 {
196 return (float) asinh ((double) x); 205 return (float) asinh ((double) x);
197 } 206 }
198 #endif 207 #endif
199 208
200 #ifndef HAVE_ATAN2F 209 #ifndef HAVE_ATAN2F
201 #define HAVE_ATAN2F 1 210 #define HAVE_ATAN2F 1
211 float atan2f (float y, float x);
212
202 float 213 float
203 atan2f(float y, float x) 214 atan2f (float y, float x)
204 { 215 {
205 return (float) atan2(y, x); 216 return (float) atan2 (y, x);
206 } 217 }
207 #endif 218 #endif
208 219
209 #ifndef HAVE_ATANF 220 #ifndef HAVE_ATANF
210 #define HAVE_ATANF 1 221 #define HAVE_ATANF 1
222 float atanf (float x);
223
211 float 224 float
212 atanf(float x) 225 atanf (float x)
213 { 226 {
214 return (float) atan(x); 227 return (float) atan (x);
215 } 228 }
216 #endif 229 #endif
217 230
218 #if HAVE_ATANH && !HAVE_ATANHF 231 #if HAVE_ATANH && !HAVE_ATANHF
232 float atanhf (float x);
233
219 float 234 float
220 atanhf (float x) 235 atanhf (float x)
221 { 236 {
222 return (float) atanh ((double) x); 237 return (float) atanh ((double) x);
223 } 238 }
224 #endif 239 #endif
225 240
226 #ifndef HAVE_CEILF 241 #ifndef HAVE_CEILF
227 #define HAVE_CEILF 1 242 #define HAVE_CEILF 1
243 float ceilf (float x);
244
228 float 245 float
229 ceilf(float x) 246 ceilf (float x)
230 { 247 {
231 return (float) ceil(x); 248 return (float) ceil (x);
232 } 249 }
233 #endif 250 #endif
234 251
235 #ifndef HAVE_COPYSIGNF 252 #ifndef HAVE_COPYSIGNF
236 #define HAVE_COPYSIGNF 1 253 #define HAVE_COPYSIGNF 1
254 float copysignf (float x, float y);
255
237 float 256 float
238 copysignf(float x, float y) 257 copysignf (float x, float y)
239 { 258 {
240 return (float) copysign(x, y); 259 return (float) copysign (x, y);
241 } 260 }
242 #endif 261 #endif
243 262
244 #ifndef HAVE_COSF 263 #ifndef HAVE_COSF
245 #define HAVE_COSF 1 264 #define HAVE_COSF 1
265 float cosf (float x);
266
246 float 267 float
247 cosf(float x) 268 cosf (float x)
248 { 269 {
249 return (float) cos(x); 270 return (float) cos (x);
250 } 271 }
251 #endif 272 #endif
252 273
253 #ifndef HAVE_COSHF 274 #ifndef HAVE_COSHF
254 #define HAVE_COSHF 1 275 #define HAVE_COSHF 1
276 float coshf (float x);
277
255 float 278 float
256 coshf(float x) 279 coshf (float x)
257 { 280 {
258 return (float) cosh(x); 281 return (float) cosh (x);
259 } 282 }
260 #endif 283 #endif
261 284
262 #ifndef HAVE_EXPF 285 #ifndef HAVE_EXPF
263 #define HAVE_EXPF 1 286 #define HAVE_EXPF 1
287 float expf (float x);
288
264 float 289 float
265 expf(float x) 290 expf (float x)
266 { 291 {
267 return (float) exp(x); 292 return (float) exp (x);
268 } 293 }
269 #endif 294 #endif
270 295
271 #ifndef HAVE_FABSF 296 #ifndef HAVE_FABSF
272 #define HAVE_FABSF 1 297 #define HAVE_FABSF 1
298 float fabsf (float x);
299
273 float 300 float
274 fabsf(float x) 301 fabsf (float x)
275 { 302 {
276 return (float) fabs(x); 303 return (float) fabs (x);
277 } 304 }
278 #endif 305 #endif
279 306
280 #ifndef HAVE_FLOORF 307 #ifndef HAVE_FLOORF
281 #define HAVE_FLOORF 1 308 #define HAVE_FLOORF 1
309 float floorf (float x);
310
282 float 311 float
283 floorf(float x) 312 floorf (float x)
284 { 313 {
285 return (float) floor(x); 314 return (float) floor (x);
286 } 315 }
287 #endif 316 #endif
288 317
289 #ifndef HAVE_FMODF 318 #ifndef HAVE_FMODF
290 #define HAVE_FMODF 1 319 #define HAVE_FMODF 1
320 float fmodf (float x, float y);
321
291 float 322 float
292 fmodf (float x, float y) 323 fmodf (float x, float y)
293 { 324 {
294 return (float) fmod (x, y); 325 return (float) fmod (x, y);
295 } 326 }
296 #endif 327 #endif
297 328
298 #ifndef HAVE_FREXPF 329 #ifndef HAVE_FREXPF
299 #define HAVE_FREXPF 1 330 #define HAVE_FREXPF 1
331 float frexpf (float x, int *exp);
332
300 float 333 float
301 frexpf(float x, int *exp) 334 frexpf (float x, int *exp)
302 { 335 {
303 return (float) frexp(x, exp); 336 return (float) frexp (x, exp);
304 } 337 }
305 #endif 338 #endif
306 339
307 #ifndef HAVE_HYPOTF 340 #ifndef HAVE_HYPOTF
308 #define HAVE_HYPOTF 1 341 #define HAVE_HYPOTF 1
342 float hypotf (float x, float y);
343
309 float 344 float
310 hypotf(float x, float y) 345 hypotf (float x, float y)
311 { 346 {
312 return (float) hypot(x, y); 347 return (float) hypot (x, y);
313 } 348 }
314 #endif 349 #endif
315 350
316 #ifndef HAVE_LOGF 351 #ifndef HAVE_LOGF
317 #define HAVE_LOGF 1 352 #define HAVE_LOGF 1
353 float logf (float x);
354
318 float 355 float
319 logf(float x) 356 logf (float x)
320 { 357 {
321 return (float) log(x); 358 return (float) log (x);
322 } 359 }
323 #endif 360 #endif
324 361
325 #ifndef HAVE_LOG10F 362 #ifndef HAVE_LOG10F
326 #define HAVE_LOG10F 1 363 #define HAVE_LOG10F 1
364 float log10f (float x);
365
327 float 366 float
328 log10f(float x) 367 log10f (float x)
329 { 368 {
330 return (float) log10(x); 369 return (float) log10 (x);
331 } 370 }
332 #endif 371 #endif
333 372
334 #ifndef HAVE_SCALBN 373 #ifndef HAVE_SCALBN
335 #define HAVE_SCALBN 1 374 #define HAVE_SCALBN 1
375 double scalbn (double x, int y);
376
336 double 377 double
337 scalbn(double x, int y) 378 scalbn (double x, int y)
338 { 379 {
339 #if (FLT_RADIX == 2) && defined(HAVE_LDEXP) 380 #if (FLT_RADIX == 2) && defined(HAVE_LDEXP)
340 return ldexp (x, y); 381 return ldexp (x, y);
341 #else 382 #else
342 return x * pow(FLT_RADIX, y); 383 return x * pow (FLT_RADIX, y);
343 #endif 384 #endif
344 } 385 }
345 #endif 386 #endif
346 387
347 #ifndef HAVE_SCALBNF 388 #ifndef HAVE_SCALBNF
348 #define HAVE_SCALBNF 1 389 #define HAVE_SCALBNF 1
390 float scalbnf (float x, int y);
391
349 float 392 float
350 scalbnf(float x, int y) 393 scalbnf (float x, int y)
351 { 394 {
352 return (float) scalbn(x, y); 395 return (float) scalbn (x, y);
353 } 396 }
354 #endif 397 #endif
355 398
356 #ifndef HAVE_SINF 399 #ifndef HAVE_SINF
357 #define HAVE_SINF 1 400 #define HAVE_SINF 1
401 float sinf (float x);
402
358 float 403 float
359 sinf(float x) 404 sinf (float x)
360 { 405 {
361 return (float) sin(x); 406 return (float) sin (x);
362 } 407 }
363 #endif 408 #endif
364 409
365 #ifndef HAVE_SINHF 410 #ifndef HAVE_SINHF
366 #define HAVE_SINHF 1 411 #define HAVE_SINHF 1
412 float sinhf (float x);
413
367 float 414 float
368 sinhf(float x) 415 sinhf (float x)
369 { 416 {
370 return (float) sinh(x); 417 return (float) sinh (x);
371 } 418 }
372 #endif 419 #endif
373 420
374 #ifndef HAVE_SQRTF 421 #ifndef HAVE_SQRTF
375 #define HAVE_SQRTF 1 422 #define HAVE_SQRTF 1
423 float sqrtf (float x);
424
376 float 425 float
377 sqrtf(float x) 426 sqrtf (float x)
378 { 427 {
379 return (float) sqrt(x); 428 return (float) sqrt (x);
380 } 429 }
381 #endif 430 #endif
382 431
383 #ifndef HAVE_TANF 432 #ifndef HAVE_TANF
384 #define HAVE_TANF 1 433 #define HAVE_TANF 1
434 float tanf (float x);
435
385 float 436 float
386 tanf(float x) 437 tanf (float x)
387 { 438 {
388 return (float) tan(x); 439 return (float) tan (x);
389 } 440 }
390 #endif 441 #endif
391 442
392 #ifndef HAVE_TANHF 443 #ifndef HAVE_TANHF
393 #define HAVE_TANHF 1 444 #define HAVE_TANHF 1
445 float tanhf (float x);
446
394 float 447 float
395 tanhf(float x) 448 tanhf (float x)
396 { 449 {
397 return (float) tanh(x); 450 return (float) tanh (x);
398 } 451 }
399 #endif 452 #endif
400 453
401 #ifndef HAVE_TRUNC 454 #ifndef HAVE_TRUNC
402 #define HAVE_TRUNC 1 455 #define HAVE_TRUNC 1
456 double trunc (double x);
457
403 double 458 double
404 trunc(double x) 459 trunc (double x)
405 { 460 {
406 if (!isfinite (x)) 461 if (!isfinite (x))
407 return x; 462 return x;
408 463
409 if (x < 0.0) 464 if (x < 0.0)
410 return - floor (-x); 465 return - floor (-x);
411 else 466 else
412 return floor (x); 467 return floor (x);
413 } 468 }
414 #endif 469 #endif
415 470
416 #ifndef HAVE_TRUNCF 471 #ifndef HAVE_TRUNCF
417 #define HAVE_TRUNCF 1 472 #define HAVE_TRUNCF 1
473 float truncf (float x);
474
418 float 475 float
419 truncf(float x) 476 truncf (float x)
420 { 477 {
421 return (float) trunc (x); 478 return (float) trunc (x);
422 } 479 }
423 #endif 480 #endif
424 481
425 #ifndef HAVE_NEXTAFTERF 482 #ifndef HAVE_NEXTAFTERF
426 #define HAVE_NEXTAFTERF 1 483 #define HAVE_NEXTAFTERF 1
427 /* This is a portable implementation of nextafterf that is intended to be 484 /* This is a portable implementation of nextafterf that is intended to be
428 independent of the floating point format or its in memory representation. 485 independent of the floating point format or its in memory representation.
429 This implementation works correctly with denormalized values. */ 486 This implementation works correctly with denormalized values. */
487 float nextafterf (float x, float y);
488
430 float 489 float
431 nextafterf(float x, float y) 490 nextafterf (float x, float y)
432 { 491 {
433 /* This variable is marked volatile to avoid excess precision problems 492 /* This variable is marked volatile to avoid excess precision problems
434 on some platforms, including IA-32. */ 493 on some platforms, including IA-32. */
435 volatile float delta; 494 volatile float delta;
436 float absx, denorm_min; 495 float absx, denorm_min;
437 496
438 if (isnan(x) || isnan(y)) 497 if (isnan (x) || isnan (y))
439 return x + y; 498 return x + y;
440 if (x == y) 499 if (x == y)
441 return x; 500 return x;
442 if (!isfinite (x)) 501 if (!isfinite (x))
443 return x > 0 ? __FLT_MAX__ : - __FLT_MAX__; 502 return x > 0 ? __FLT_MAX__ : - __FLT_MAX__;
444 503
445 /* absx = fabsf (x); */ 504 /* absx = fabsf (x); */
446 absx = (x < 0.0) ? -x : x; 505 absx = (x < 0.0) ? -x : x;
447 506
448 /* __FLT_DENORM_MIN__ is non-zero iff the target supports denormals. */ 507 /* __FLT_DENORM_MIN__ is non-zero iff the target supports denormals. */
(...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after
483 542
484 return x + delta; 543 return x + delta;
485 } 544 }
486 #endif 545 #endif
487 546
488 547
489 #if !defined(HAVE_POWF) || defined(HAVE_BROKEN_POWF) 548 #if !defined(HAVE_POWF) || defined(HAVE_BROKEN_POWF)
490 #ifndef HAVE_POWF 549 #ifndef HAVE_POWF
491 #define HAVE_POWF 1 550 #define HAVE_POWF 1
492 #endif 551 #endif
552 float powf (float x, float y);
553
493 float 554 float
494 powf(float x, float y) 555 powf (float x, float y)
495 { 556 {
496 return (float) pow(x, y); 557 return (float) pow (x, y);
497 } 558 }
498 #endif 559 #endif
499 560
500 /* Note that if fpclassify is not defined, then NaN is not handled */ 561 /* Note that if fpclassify is not defined, then NaN is not handled */
501 562
502 /* Algorithm by Steven G. Kargl. */ 563 /* Algorithm by Steven G. Kargl. */
503 564
504 #if !defined(HAVE_ROUNDL) 565 #if !defined(HAVE_ROUNDL)
505 #define HAVE_ROUNDL 1 566 #define HAVE_ROUNDL 1
567 long double roundl (long double x);
568
506 #if defined(HAVE_CEILL) 569 #if defined(HAVE_CEILL)
507 /* Round to nearest integral value. If the argument is halfway between two 570 /* Round to nearest integral value. If the argument is halfway between two
508 integral values then round away from zero. */ 571 integral values then round away from zero. */
509 572
510 long double 573 long double
511 roundl(long double x) 574 roundl (long double x)
512 { 575 {
513 long double t; 576 long double t;
514 if (!isfinite (x)) 577 if (!isfinite (x))
515 return (x); 578 return (x);
516 579
517 if (x >= 0.0) 580 if (x >= 0.0)
518 { 581 {
519 t = ceill(x); 582 t = ceill (x);
520 if (t - x > 0.5) 583 if (t - x > 0.5)
521 t -= 1.0; 584 t -= 1.0;
522 return (t); 585 return (t);
523 } 586 }
524 else 587 else
525 { 588 {
526 t = ceill(-x); 589 t = ceill (-x);
527 if (t + x > 0.5) 590 if (t + x > 0.5)
528 t -= 1.0; 591 t -= 1.0;
529 return (-t); 592 return (-t);
530 } 593 }
531 } 594 }
532 #else 595 #else
533 596
534 /* Poor version of roundl for system that don't have ceill. */ 597 /* Poor version of roundl for system that don't have ceill. */
535 long double 598 long double
536 roundl(long double x) 599 roundl (long double x)
537 { 600 {
538 if (x > DBL_MAX || x < -DBL_MAX) 601 if (x > DBL_MAX || x < -DBL_MAX)
539 { 602 {
540 #ifdef HAVE_NEXTAFTERL 603 #ifdef HAVE_NEXTAFTERL
541 static long double prechalf = nexafterl (0.5L, LDBL_MAX); 604 static long double prechalf = nexafterl (0.5L, LDBL_MAX);
542 #else 605 #else
543 static long double prechalf = 0.5L; 606 static long double prechalf = 0.5L;
544 #endif 607 #endif
545 return (GFC_INTEGER_LARGEST) (x + (x > 0 ? prechalf : -prechalf)); 608 return (GFC_INTEGER_LARGEST) (x + (x > 0 ? prechalf : -prechalf));
546 } 609 }
547 else 610 else
548 /* Use round(). */ 611 /* Use round(). */
549 return round((double) x); 612 return round ((double) x);
550 } 613 }
551 614
552 #endif 615 #endif
553 #endif 616 #endif
554 617
555 #ifndef HAVE_ROUND 618 #ifndef HAVE_ROUND
556 #define HAVE_ROUND 1 619 #define HAVE_ROUND 1
557 /* Round to nearest integral value. If the argument is halfway between two 620 /* Round to nearest integral value. If the argument is halfway between two
558 integral values then round away from zero. */ 621 integral values then round away from zero. */
622 double round (double x);
559 623
560 double 624 double
561 round(double x) 625 round (double x)
562 { 626 {
563 double t; 627 double t;
564 if (!isfinite (x)) 628 if (!isfinite (x))
565 return (x); 629 return (x);
566 630
567 if (x >= 0.0) 631 if (x >= 0.0)
568 { 632 {
569 t = ceil(x); 633 t = floor (x);
570 if (t - x > 0.5) 634 if (t - x <= -0.5)
571 » t -= 1.0; 635 » t += 1.0;
572 return (t); 636 return (t);
573 } 637 }
574 else 638 else
575 { 639 {
576 t = ceil(-x); 640 t = floor (-x);
577 if (t + x > 0.5) 641 if (t + x <= -0.5)
578 » t -= 1.0; 642 » t += 1.0;
579 return (-t); 643 return (-t);
580 } 644 }
581 } 645 }
582 #endif 646 #endif
583 647
584 #ifndef HAVE_ROUNDF 648 #ifndef HAVE_ROUNDF
585 #define HAVE_ROUNDF 1 649 #define HAVE_ROUNDF 1
586 /* Round to nearest integral value. If the argument is halfway between two 650 /* Round to nearest integral value. If the argument is halfway between two
587 integral values then round away from zero. */ 651 integral values then round away from zero. */
652 float roundf (float x);
588 653
589 float 654 float
590 roundf(float x) 655 roundf (float x)
591 { 656 {
592 float t; 657 float t;
593 if (!isfinite (x)) 658 if (!isfinite (x))
594 return (x); 659 return (x);
595 660
596 if (x >= 0.0) 661 if (x >= 0.0)
597 { 662 {
598 t = ceilf(x); 663 t = floorf (x);
599 if (t - x > 0.5) 664 if (t - x <= -0.5)
600 » t -= 1.0; 665 » t += 1.0;
601 return (t); 666 return (t);
602 } 667 }
603 else 668 else
604 { 669 {
605 t = ceilf(-x); 670 t = floorf (-x);
606 if (t + x > 0.5) 671 if (t + x <= -0.5)
607 » t -= 1.0; 672 » t += 1.0;
608 return (-t); 673 return (-t);
609 } 674 }
610 } 675 }
611 #endif 676 #endif
612 677
613 678
614 /* lround{f,,l} and llround{f,,l} functions. */ 679 /* lround{f,,l} and llround{f,,l} functions. */
615 680
616 #if !defined(HAVE_LROUNDF) && defined(HAVE_ROUNDF) 681 #if !defined(HAVE_LROUNDF) && defined(HAVE_ROUNDF)
617 #define HAVE_LROUNDF 1 682 #define HAVE_LROUNDF 1
683 long int lroundf (float x);
684
618 long int 685 long int
619 lroundf (float x) 686 lroundf (float x)
620 { 687 {
621 return (long int) roundf (x); 688 return (long int) roundf (x);
622 } 689 }
623 #endif 690 #endif
624 691
625 #if !defined(HAVE_LROUND) && defined(HAVE_ROUND) 692 #if !defined(HAVE_LROUND) && defined(HAVE_ROUND)
626 #define HAVE_LROUND 1 693 #define HAVE_LROUND 1
694 long int lround (double x);
695
627 long int 696 long int
628 lround (double x) 697 lround (double x)
629 { 698 {
630 return (long int) round (x); 699 return (long int) round (x);
631 } 700 }
632 #endif 701 #endif
633 702
634 #if !defined(HAVE_LROUNDL) && defined(HAVE_ROUNDL) 703 #if !defined(HAVE_LROUNDL) && defined(HAVE_ROUNDL)
635 #define HAVE_LROUNDL 1 704 #define HAVE_LROUNDL 1
705 long int lroundl (long double x);
706
636 long int 707 long int
637 lroundl (long double x) 708 lroundl (long double x)
638 { 709 {
639 return (long long int) roundl (x); 710 return (long long int) roundl (x);
640 } 711 }
641 #endif 712 #endif
642 713
643 #if !defined(HAVE_LLROUNDF) && defined(HAVE_ROUNDF) 714 #if !defined(HAVE_LLROUNDF) && defined(HAVE_ROUNDF)
644 #define HAVE_LLROUNDF 1 715 #define HAVE_LLROUNDF 1
716 long long int llroundf (float x);
717
645 long long int 718 long long int
646 llroundf (float x) 719 llroundf (float x)
647 { 720 {
648 return (long long int) roundf (x); 721 return (long long int) roundf (x);
649 } 722 }
650 #endif 723 #endif
651 724
652 #if !defined(HAVE_LLROUND) && defined(HAVE_ROUND) 725 #if !defined(HAVE_LLROUND) && defined(HAVE_ROUND)
653 #define HAVE_LLROUND 1 726 #define HAVE_LLROUND 1
727 long long int llround (double x);
728
654 long long int 729 long long int
655 llround (double x) 730 llround (double x)
656 { 731 {
657 return (long long int) round (x); 732 return (long long int) round (x);
658 } 733 }
659 #endif 734 #endif
660 735
661 #if !defined(HAVE_LLROUNDL) && defined(HAVE_ROUNDL) 736 #if !defined(HAVE_LLROUNDL) && defined(HAVE_ROUNDL)
662 #define HAVE_LLROUNDL 1 737 #define HAVE_LLROUNDL 1
738 long long int llroundl (long double x);
739
663 long long int 740 long long int
664 llroundl (long double x) 741 llroundl (long double x)
665 { 742 {
666 return (long long int) roundl (x); 743 return (long long int) roundl (x);
667 } 744 }
668 #endif 745 #endif
669 746
670 747
671 #ifndef HAVE_LOG10L 748 #ifndef HAVE_LOG10L
672 #define HAVE_LOG10L 1 749 #define HAVE_LOG10L 1
673 /* log10 function for long double variables. The version provided here 750 /* log10 function for long double variables. The version provided here
674 reduces the argument until it fits into a double, then use log10. */ 751 reduces the argument until it fits into a double, then use log10. */
752 long double log10l (long double x);
753
675 long double 754 long double
676 log10l(long double x) 755 log10l (long double x)
677 { 756 {
678 #if LDBL_MAX_EXP > DBL_MAX_EXP 757 #if LDBL_MAX_EXP > DBL_MAX_EXP
679 if (x > DBL_MAX) 758 if (x > DBL_MAX)
680 { 759 {
681 double val; 760 double val;
682 int p2_result = 0; 761 int p2_result = 0;
683 if (x > 0x1p16383L) { p2_result += 16383; x /= 0x1p16383L; } 762 if (x > 0x1p16383L) { p2_result += 16383; x /= 0x1p16383L; }
684 if (x > 0x1p8191L) { p2_result += 8191; x /= 0x1p8191L; } 763 if (x > 0x1p8191L) { p2_result += 8191; x /= 0x1p8191L; }
685 if (x > 0x1p4095L) { p2_result += 4095; x /= 0x1p4095L; } 764 if (x > 0x1p4095L) { p2_result += 4095; x /= 0x1p4095L; }
686 if (x > 0x1p2047L) { p2_result += 2047; x /= 0x1p2047L; } 765 if (x > 0x1p2047L) { p2_result += 2047; x /= 0x1p2047L; }
687 if (x > 0x1p1023L) { p2_result += 1023; x /= 0x1p1023L; } 766 if (x > 0x1p1023L) { p2_result += 1023; x /= 0x1p1023L; }
688 val = log10 ((double) x); 767 val = log10 ((double) x);
689 return (val + p2_result * .30102999566398119521373889472449302L); 768 return (val + p2_result * .30102999566398119521373889472449302L);
690 } 769 }
691 #endif 770 #endif
692 #if LDBL_MIN_EXP < DBL_MIN_EXP 771 #if LDBL_MIN_EXP < DBL_MIN_EXP
693 if (x < DBL_MIN) 772 if (x < DBL_MIN)
694 { 773 {
695 double val; 774 double val;
696 int p2_result = 0; 775 int p2_result = 0;
697 if (x < 0x1p-16380L) { p2_result += 16380; x /= 0x1p-16380L; } 776 if (x < 0x1p-16380L) { p2_result += 16380; x /= 0x1p-16380L; }
698 if (x < 0x1p-8189L) { p2_result += 8189; x /= 0x1p-8189L; } 777 if (x < 0x1p-8189L) { p2_result += 8189; x /= 0x1p-8189L; }
699 if (x < 0x1p-4093L) { p2_result += 4093; x /= 0x1p-4093L; } 778 if (x < 0x1p-4093L) { p2_result += 4093; x /= 0x1p-4093L; }
700 if (x < 0x1p-2045L) { p2_result += 2045; x /= 0x1p-2045L; } 779 if (x < 0x1p-2045L) { p2_result += 2045; x /= 0x1p-2045L; }
701 if (x < 0x1p-1021L) { p2_result += 1021; x /= 0x1p-1021L; } 780 if (x < 0x1p-1021L) { p2_result += 1021; x /= 0x1p-1021L; }
702 val = fabs(log10 ((double) x)); 781 val = fabs (log10 ((double) x));
703 return (- val - p2_result * .30102999566398119521373889472449302L); 782 return (- val - p2_result * .30102999566398119521373889472449302L);
704 } 783 }
705 #endif 784 #endif
706 return log10 (x); 785 return log10 (x);
707 } 786 }
708 #endif 787 #endif
709 788
710 789
711 #ifndef HAVE_FLOORL 790 #ifndef HAVE_FLOORL
712 #define HAVE_FLOORL 1 791 #define HAVE_FLOORL 1
792 long double floorl (long double x);
793
713 long double 794 long double
714 floorl (long double x) 795 floorl (long double x)
715 { 796 {
716 /* Zero, possibly signed. */ 797 /* Zero, possibly signed. */
717 if (x == 0) 798 if (x == 0)
718 return x; 799 return x;
719 800
720 /* Large magnitude. */ 801 /* Large magnitude. */
721 if (x > DBL_MAX || x < (-DBL_MAX)) 802 if (x > DBL_MAX || x < (-DBL_MAX))
722 return x; 803 return x;
723 804
724 /* Small positive values. */ 805 /* Small positive values. */
725 if (x >= 0 && x < DBL_MIN) 806 if (x >= 0 && x < DBL_MIN)
726 return 0; 807 return 0;
727 808
728 /* Small negative values. */ 809 /* Small negative values. */
729 if (x < 0 && x > (-DBL_MIN)) 810 if (x < 0 && x > (-DBL_MIN))
730 return -1; 811 return -1;
731 812
732 return floor (x); 813 return floor (x);
733 } 814 }
734 #endif 815 #endif
735 816
736 817
737 #ifndef HAVE_FMODL 818 #ifndef HAVE_FMODL
738 #define HAVE_FMODL 1 819 #define HAVE_FMODL 1
820 long double fmodl (long double x, long double y);
821
739 long double 822 long double
740 fmodl (long double x, long double y) 823 fmodl (long double x, long double y)
741 { 824 {
742 if (y == 0.0L) 825 if (y == 0.0L)
743 return 0.0L; 826 return 0.0L;
744 827
745 /* Need to check that the result has the same sign as x and magnitude 828 /* Need to check that the result has the same sign as x and magnitude
746 less than the magnitude of y. */ 829 less than the magnitude of y. */
747 return x - floorl (x / y) * y; 830 return x - floorl (x / y) * y;
748 } 831 }
749 #endif 832 #endif
750 833
751 834
752 #if !defined(HAVE_CABSF) 835 #if !defined(HAVE_CABSF)
753 #define HAVE_CABSF 1 836 #define HAVE_CABSF 1
837 float cabsf (float complex z);
838
754 float 839 float
755 cabsf (float complex z) 840 cabsf (float complex z)
756 { 841 {
757 return hypotf (REALPART (z), IMAGPART (z)); 842 return hypotf (REALPART (z), IMAGPART (z));
758 } 843 }
759 #endif 844 #endif
760 845
761 #if !defined(HAVE_CABS) 846 #if !defined(HAVE_CABS)
762 #define HAVE_CABS 1 847 #define HAVE_CABS 1
848 double cabs (double complex z);
849
763 double 850 double
764 cabs (double complex z) 851 cabs (double complex z)
765 { 852 {
766 return hypot (REALPART (z), IMAGPART (z)); 853 return hypot (REALPART (z), IMAGPART (z));
767 } 854 }
768 #endif 855 #endif
769 856
770 #if !defined(HAVE_CABSL) && defined(HAVE_HYPOTL) 857 #if !defined(HAVE_CABSL) && defined(HAVE_HYPOTL)
771 #define HAVE_CABSL 1 858 #define HAVE_CABSL 1
859 long double cabsl (long double complex z);
860
772 long double 861 long double
773 cabsl (long double complex z) 862 cabsl (long double complex z)
774 { 863 {
775 return hypotl (REALPART (z), IMAGPART (z)); 864 return hypotl (REALPART (z), IMAGPART (z));
776 } 865 }
777 #endif 866 #endif
778 867
779 868
780 #if !defined(HAVE_CARGF) 869 #if !defined(HAVE_CARGF)
781 #define HAVE_CARGF 1 870 #define HAVE_CARGF 1
871 float cargf (float complex z);
872
782 float 873 float
783 cargf (float complex z) 874 cargf (float complex z)
784 { 875 {
785 return atan2f (IMAGPART (z), REALPART (z)); 876 return atan2f (IMAGPART (z), REALPART (z));
786 } 877 }
787 #endif 878 #endif
788 879
789 #if !defined(HAVE_CARG) 880 #if !defined(HAVE_CARG)
790 #define HAVE_CARG 1 881 #define HAVE_CARG 1
882 double carg (double complex z);
883
791 double 884 double
792 carg (double complex z) 885 carg (double complex z)
793 { 886 {
794 return atan2 (IMAGPART (z), REALPART (z)); 887 return atan2 (IMAGPART (z), REALPART (z));
795 } 888 }
796 #endif 889 #endif
797 890
798 #if !defined(HAVE_CARGL) && defined(HAVE_ATAN2L) 891 #if !defined(HAVE_CARGL) && defined(HAVE_ATAN2L)
799 #define HAVE_CARGL 1 892 #define HAVE_CARGL 1
893 long double cargl (long double complex z);
894
800 long double 895 long double
801 cargl (long double complex z) 896 cargl (long double complex z)
802 { 897 {
803 return atan2l (IMAGPART (z), REALPART (z)); 898 return atan2l (IMAGPART (z), REALPART (z));
804 } 899 }
805 #endif 900 #endif
806 901
807 902
808 /* exp(z) = exp(a)*(cos(b) + i sin(b)) */ 903 /* exp(z) = exp(a)*(cos(b) + i sin(b)) */
809 #if !defined(HAVE_CEXPF) 904 #if !defined(HAVE_CEXPF)
810 #define HAVE_CEXPF 1 905 #define HAVE_CEXPF 1
906 float complex cexpf (float complex z);
907
811 float complex 908 float complex
812 cexpf (float complex z) 909 cexpf (float complex z)
813 { 910 {
814 float a, b; 911 float a, b;
815 float complex v; 912 float complex v;
816 913
817 a = REALPART (z); 914 a = REALPART (z);
818 b = IMAGPART (z); 915 b = IMAGPART (z);
819 COMPLEX_ASSIGN (v, cosf (b), sinf (b)); 916 COMPLEX_ASSIGN (v, cosf (b), sinf (b));
820 return expf (a) * v; 917 return expf (a) * v;
821 } 918 }
822 #endif 919 #endif
823 920
824 #if !defined(HAVE_CEXP) 921 #if !defined(HAVE_CEXP)
825 #define HAVE_CEXP 1 922 #define HAVE_CEXP 1
923 double complex cexp (double complex z);
924
826 double complex 925 double complex
827 cexp (double complex z) 926 cexp (double complex z)
828 { 927 {
829 double a, b; 928 double a, b;
830 double complex v; 929 double complex v;
831 930
832 a = REALPART (z); 931 a = REALPART (z);
833 b = IMAGPART (z); 932 b = IMAGPART (z);
834 COMPLEX_ASSIGN (v, cos (b), sin (b)); 933 COMPLEX_ASSIGN (v, cos (b), sin (b));
835 return exp (a) * v; 934 return exp (a) * v;
836 } 935 }
837 #endif 936 #endif
838 937
839 #if !defined(HAVE_CEXPL) && defined(HAVE_COSL) && defined(HAVE_SINL) && defined( EXPL) 938 #if !defined(HAVE_CEXPL) && defined(HAVE_COSL) && defined(HAVE_SINL) && defined( EXPL)
840 #define HAVE_CEXPL 1 939 #define HAVE_CEXPL 1
940 long double complex cexpl (long double complex z);
941
841 long double complex 942 long double complex
842 cexpl (long double complex z) 943 cexpl (long double complex z)
843 { 944 {
844 long double a, b; 945 long double a, b;
845 long double complex v; 946 long double complex v;
846 947
847 a = REALPART (z); 948 a = REALPART (z);
848 b = IMAGPART (z); 949 b = IMAGPART (z);
849 COMPLEX_ASSIGN (v, cosl (b), sinl (b)); 950 COMPLEX_ASSIGN (v, cosl (b), sinl (b));
850 return expl (a) * v; 951 return expl (a) * v;
851 } 952 }
852 #endif 953 #endif
853 954
854 955
855 /* log(z) = log (cabs(z)) + i*carg(z) */ 956 /* log(z) = log (cabs(z)) + i*carg(z) */
856 #if !defined(HAVE_CLOGF) 957 #if !defined(HAVE_CLOGF)
857 #define HAVE_CLOGF 1 958 #define HAVE_CLOGF 1
959 float complex clogf (float complex z);
960
858 float complex 961 float complex
859 clogf (float complex z) 962 clogf (float complex z)
860 { 963 {
861 float complex v; 964 float complex v;
862 965
863 COMPLEX_ASSIGN (v, logf (cabsf (z)), cargf (z)); 966 COMPLEX_ASSIGN (v, logf (cabsf (z)), cargf (z));
864 return v; 967 return v;
865 } 968 }
866 #endif 969 #endif
867 970
868 #if !defined(HAVE_CLOG) 971 #if !defined(HAVE_CLOG)
869 #define HAVE_CLOG 1 972 #define HAVE_CLOG 1
973 double complex clog (double complex z);
974
870 double complex 975 double complex
871 clog (double complex z) 976 clog (double complex z)
872 { 977 {
873 double complex v; 978 double complex v;
874 979
875 COMPLEX_ASSIGN (v, log (cabs (z)), carg (z)); 980 COMPLEX_ASSIGN (v, log (cabs (z)), carg (z));
876 return v; 981 return v;
877 } 982 }
878 #endif 983 #endif
879 984
880 #if !defined(HAVE_CLOGL) && defined(HAVE_LOGL) && defined(HAVE_CABSL) && defined (HAVE_CARGL) 985 #if !defined(HAVE_CLOGL) && defined(HAVE_LOGL) && defined(HAVE_CABSL) && defined (HAVE_CARGL)
881 #define HAVE_CLOGL 1 986 #define HAVE_CLOGL 1
987 long double complex clogl (long double complex z);
988
882 long double complex 989 long double complex
883 clogl (long double complex z) 990 clogl (long double complex z)
884 { 991 {
885 long double complex v; 992 long double complex v;
886 993
887 COMPLEX_ASSIGN (v, logl (cabsl (z)), cargl (z)); 994 COMPLEX_ASSIGN (v, logl (cabsl (z)), cargl (z));
888 return v; 995 return v;
889 } 996 }
890 #endif 997 #endif
891 998
892 999
893 /* log10(z) = log10 (cabs(z)) + i*carg(z) */ 1000 /* log10(z) = log10 (cabs(z)) + i*carg(z) */
894 #if !defined(HAVE_CLOG10F) 1001 #if !defined(HAVE_CLOG10F)
895 #define HAVE_CLOG10F 1 1002 #define HAVE_CLOG10F 1
1003 float complex clog10f (float complex z);
1004
896 float complex 1005 float complex
897 clog10f (float complex z) 1006 clog10f (float complex z)
898 { 1007 {
899 float complex v; 1008 float complex v;
900 1009
901 COMPLEX_ASSIGN (v, log10f (cabsf (z)), cargf (z)); 1010 COMPLEX_ASSIGN (v, log10f (cabsf (z)), cargf (z));
902 return v; 1011 return v;
903 } 1012 }
904 #endif 1013 #endif
905 1014
906 #if !defined(HAVE_CLOG10) 1015 #if !defined(HAVE_CLOG10)
907 #define HAVE_CLOG10 1 1016 #define HAVE_CLOG10 1
1017 double complex clog10 (double complex z);
1018
908 double complex 1019 double complex
909 clog10 (double complex z) 1020 clog10 (double complex z)
910 { 1021 {
911 double complex v; 1022 double complex v;
912 1023
913 COMPLEX_ASSIGN (v, log10 (cabs (z)), carg (z)); 1024 COMPLEX_ASSIGN (v, log10 (cabs (z)), carg (z));
914 return v; 1025 return v;
915 } 1026 }
916 #endif 1027 #endif
917 1028
918 #if !defined(HAVE_CLOG10L) && defined(HAVE_LOG10L) && defined(HAVE_CABSL) && def ined(HAVE_CARGL) 1029 #if !defined(HAVE_CLOG10L) && defined(HAVE_LOG10L) && defined(HAVE_CABSL) && def ined(HAVE_CARGL)
919 #define HAVE_CLOG10L 1 1030 #define HAVE_CLOG10L 1
1031 long double complex clog10l (long double complex z);
1032
920 long double complex 1033 long double complex
921 clog10l (long double complex z) 1034 clog10l (long double complex z)
922 { 1035 {
923 long double complex v; 1036 long double complex v;
924 1037
925 COMPLEX_ASSIGN (v, log10l (cabsl (z)), cargl (z)); 1038 COMPLEX_ASSIGN (v, log10l (cabsl (z)), cargl (z));
926 return v; 1039 return v;
927 } 1040 }
928 #endif 1041 #endif
929 1042
930 1043
931 /* pow(base, power) = cexp (power * clog (base)) */ 1044 /* pow(base, power) = cexp (power * clog (base)) */
932 #if !defined(HAVE_CPOWF) 1045 #if !defined(HAVE_CPOWF)
933 #define HAVE_CPOWF 1 1046 #define HAVE_CPOWF 1
1047 float complex cpowf (float complex base, float complex power);
1048
934 float complex 1049 float complex
935 cpowf (float complex base, float complex power) 1050 cpowf (float complex base, float complex power)
936 { 1051 {
937 return cexpf (power * clogf (base)); 1052 return cexpf (power * clogf (base));
938 } 1053 }
939 #endif 1054 #endif
940 1055
941 #if !defined(HAVE_CPOW) 1056 #if !defined(HAVE_CPOW)
942 #define HAVE_CPOW 1 1057 #define HAVE_CPOW 1
1058 double complex cpow (double complex base, double complex power);
1059
943 double complex 1060 double complex
944 cpow (double complex base, double complex power) 1061 cpow (double complex base, double complex power)
945 { 1062 {
946 return cexp (power * clog (base)); 1063 return cexp (power * clog (base));
947 } 1064 }
948 #endif 1065 #endif
949 1066
950 #if !defined(HAVE_CPOWL) && defined(HAVE_CEXPL) && defined(HAVE_CLOGL) 1067 #if !defined(HAVE_CPOWL) && defined(HAVE_CEXPL) && defined(HAVE_CLOGL)
951 #define HAVE_CPOWL 1 1068 #define HAVE_CPOWL 1
1069 long double complex cpowl (long double complex base, long double complex power);
1070
952 long double complex 1071 long double complex
953 cpowl (long double complex base, long double complex power) 1072 cpowl (long double complex base, long double complex power)
954 { 1073 {
955 return cexpl (power * clogl (base)); 1074 return cexpl (power * clogl (base));
956 } 1075 }
957 #endif 1076 #endif
958 1077
959 1078
960 /* sqrt(z). Algorithm pulled from glibc. */ 1079 /* sqrt(z). Algorithm pulled from glibc. */
961 #if !defined(HAVE_CSQRTF) 1080 #if !defined(HAVE_CSQRTF)
962 #define HAVE_CSQRTF 1 1081 #define HAVE_CSQRTF 1
1082 float complex csqrtf (float complex z);
1083
963 float complex 1084 float complex
964 csqrtf (float complex z) 1085 csqrtf (float complex z)
965 { 1086 {
966 float re, im; 1087 float re, im;
967 float complex v; 1088 float complex v;
968 1089
969 re = REALPART (z); 1090 re = REALPART (z);
970 im = IMAGPART (z); 1091 im = IMAGPART (z);
971 if (im == 0) 1092 if (im == 0)
972 { 1093 {
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after
1006 } 1127 }
1007 1128
1008 COMPLEX_ASSIGN (v, r, copysignf (s, im)); 1129 COMPLEX_ASSIGN (v, r, copysignf (s, im));
1009 } 1130 }
1010 return v; 1131 return v;
1011 } 1132 }
1012 #endif 1133 #endif
1013 1134
1014 #if !defined(HAVE_CSQRT) 1135 #if !defined(HAVE_CSQRT)
1015 #define HAVE_CSQRT 1 1136 #define HAVE_CSQRT 1
1137 double complex csqrt (double complex z);
1138
1016 double complex 1139 double complex
1017 csqrt (double complex z) 1140 csqrt (double complex z)
1018 { 1141 {
1019 double re, im; 1142 double re, im;
1020 double complex v; 1143 double complex v;
1021 1144
1022 re = REALPART (z); 1145 re = REALPART (z);
1023 im = IMAGPART (z); 1146 im = IMAGPART (z);
1024 if (im == 0) 1147 if (im == 0)
1025 { 1148 {
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after
1059 } 1182 }
1060 1183
1061 COMPLEX_ASSIGN (v, r, copysign (s, im)); 1184 COMPLEX_ASSIGN (v, r, copysign (s, im));
1062 } 1185 }
1063 return v; 1186 return v;
1064 } 1187 }
1065 #endif 1188 #endif
1066 1189
1067 #if !defined(HAVE_CSQRTL) && defined(HAVE_COPYSIGNL) && defined(HAVE_SQRTL) && d efined(HAVE_FABSL) && defined(HAVE_HYPOTL) 1190 #if !defined(HAVE_CSQRTL) && defined(HAVE_COPYSIGNL) && defined(HAVE_SQRTL) && d efined(HAVE_FABSL) && defined(HAVE_HYPOTL)
1068 #define HAVE_CSQRTL 1 1191 #define HAVE_CSQRTL 1
1192 long double complex csqrtl (long double complex z);
1193
1069 long double complex 1194 long double complex
1070 csqrtl (long double complex z) 1195 csqrtl (long double complex z)
1071 { 1196 {
1072 long double re, im; 1197 long double re, im;
1073 long double complex v; 1198 long double complex v;
1074 1199
1075 re = REALPART (z); 1200 re = REALPART (z);
1076 im = IMAGPART (z); 1201 im = IMAGPART (z);
1077 if (im == 0) 1202 if (im == 0)
1078 { 1203 {
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after
1114 COMPLEX_ASSIGN (v, r, copysignl (s, im)); 1239 COMPLEX_ASSIGN (v, r, copysignl (s, im));
1115 } 1240 }
1116 return v; 1241 return v;
1117 } 1242 }
1118 #endif 1243 #endif
1119 1244
1120 1245
1121 /* sinh(a + i b) = sinh(a) cos(b) + i cosh(a) sin(b) */ 1246 /* sinh(a + i b) = sinh(a) cos(b) + i cosh(a) sin(b) */
1122 #if !defined(HAVE_CSINHF) 1247 #if !defined(HAVE_CSINHF)
1123 #define HAVE_CSINHF 1 1248 #define HAVE_CSINHF 1
1249 float complex csinhf (float complex a);
1250
1124 float complex 1251 float complex
1125 csinhf (float complex a) 1252 csinhf (float complex a)
1126 { 1253 {
1127 float r, i; 1254 float r, i;
1128 float complex v; 1255 float complex v;
1129 1256
1130 r = REALPART (a); 1257 r = REALPART (a);
1131 i = IMAGPART (a); 1258 i = IMAGPART (a);
1132 COMPLEX_ASSIGN (v, sinhf (r) * cosf (i), coshf (r) * sinf (i)); 1259 COMPLEX_ASSIGN (v, sinhf (r) * cosf (i), coshf (r) * sinf (i));
1133 return v; 1260 return v;
1134 } 1261 }
1135 #endif 1262 #endif
1136 1263
1137 #if !defined(HAVE_CSINH) 1264 #if !defined(HAVE_CSINH)
1138 #define HAVE_CSINH 1 1265 #define HAVE_CSINH 1
1266 double complex csinh (double complex a);
1267
1139 double complex 1268 double complex
1140 csinh (double complex a) 1269 csinh (double complex a)
1141 { 1270 {
1142 double r, i; 1271 double r, i;
1143 double complex v; 1272 double complex v;
1144 1273
1145 r = REALPART (a); 1274 r = REALPART (a);
1146 i = IMAGPART (a); 1275 i = IMAGPART (a);
1147 COMPLEX_ASSIGN (v, sinh (r) * cos (i), cosh (r) * sin (i)); 1276 COMPLEX_ASSIGN (v, sinh (r) * cos (i), cosh (r) * sin (i));
1148 return v; 1277 return v;
1149 } 1278 }
1150 #endif 1279 #endif
1151 1280
1152 #if !defined(HAVE_CSINHL) && defined(HAVE_COSL) && defined(HAVE_COSHL) && define d(HAVE_SINL) && defined(HAVE_SINHL) 1281 #if !defined(HAVE_CSINHL) && defined(HAVE_COSL) && defined(HAVE_COSHL) && define d(HAVE_SINL) && defined(HAVE_SINHL)
1153 #define HAVE_CSINHL 1 1282 #define HAVE_CSINHL 1
1283 long double complex csinhl (long double complex a);
1284
1154 long double complex 1285 long double complex
1155 csinhl (long double complex a) 1286 csinhl (long double complex a)
1156 { 1287 {
1157 long double r, i; 1288 long double r, i;
1158 long double complex v; 1289 long double complex v;
1159 1290
1160 r = REALPART (a); 1291 r = REALPART (a);
1161 i = IMAGPART (a); 1292 i = IMAGPART (a);
1162 COMPLEX_ASSIGN (v, sinhl (r) * cosl (i), coshl (r) * sinl (i)); 1293 COMPLEX_ASSIGN (v, sinhl (r) * cosl (i), coshl (r) * sinl (i));
1163 return v; 1294 return v;
1164 } 1295 }
1165 #endif 1296 #endif
1166 1297
1167 1298
1168 /* cosh(a + i b) = cosh(a) cos(b) - i sinh(a) sin(b) */ 1299 /* cosh(a + i b) = cosh(a) cos(b) + i sinh(a) sin(b) */
1169 #if !defined(HAVE_CCOSHF) 1300 #if !defined(HAVE_CCOSHF)
1170 #define HAVE_CCOSHF 1 1301 #define HAVE_CCOSHF 1
1302 float complex ccoshf (float complex a);
1303
1171 float complex 1304 float complex
1172 ccoshf (float complex a) 1305 ccoshf (float complex a)
1173 { 1306 {
1174 float r, i; 1307 float r, i;
1175 float complex v; 1308 float complex v;
1176 1309
1177 r = REALPART (a); 1310 r = REALPART (a);
1178 i = IMAGPART (a); 1311 i = IMAGPART (a);
1179 COMPLEX_ASSIGN (v, coshf (r) * cosf (i), - (sinhf (r) * sinf (i))); 1312 COMPLEX_ASSIGN (v, coshf (r) * cosf (i), sinhf (r) * sinf (i));
1180 return v; 1313 return v;
1181 } 1314 }
1182 #endif 1315 #endif
1183 1316
1184 #if !defined(HAVE_CCOSH) 1317 #if !defined(HAVE_CCOSH)
1185 #define HAVE_CCOSH 1 1318 #define HAVE_CCOSH 1
1319 double complex ccosh (double complex a);
1320
1186 double complex 1321 double complex
1187 ccosh (double complex a) 1322 ccosh (double complex a)
1188 { 1323 {
1189 double r, i; 1324 double r, i;
1190 double complex v; 1325 double complex v;
1191 1326
1192 r = REALPART (a); 1327 r = REALPART (a);
1193 i = IMAGPART (a); 1328 i = IMAGPART (a);
1194 COMPLEX_ASSIGN (v, cosh (r) * cos (i), - (sinh (r) * sin (i))); 1329 COMPLEX_ASSIGN (v, cosh (r) * cos (i), sinh (r) * sin (i));
1195 return v; 1330 return v;
1196 } 1331 }
1197 #endif 1332 #endif
1198 1333
1199 #if !defined(HAVE_CCOSHL) && defined(HAVE_COSL) && defined(HAVE_COSHL) && define d(HAVE_SINL) && defined(HAVE_SINHL) 1334 #if !defined(HAVE_CCOSHL) && defined(HAVE_COSL) && defined(HAVE_COSHL) && define d(HAVE_SINL) && defined(HAVE_SINHL)
1200 #define HAVE_CCOSHL 1 1335 #define HAVE_CCOSHL 1
1336 long double complex ccoshl (long double complex a);
1337
1201 long double complex 1338 long double complex
1202 ccoshl (long double complex a) 1339 ccoshl (long double complex a)
1203 { 1340 {
1204 long double r, i; 1341 long double r, i;
1205 long double complex v; 1342 long double complex v;
1206 1343
1207 r = REALPART (a); 1344 r = REALPART (a);
1208 i = IMAGPART (a); 1345 i = IMAGPART (a);
1209 COMPLEX_ASSIGN (v, coshl (r) * cosl (i), - (sinhl (r) * sinl (i))); 1346 COMPLEX_ASSIGN (v, coshl (r) * cosl (i), sinhl (r) * sinl (i));
1210 return v; 1347 return v;
1211 } 1348 }
1212 #endif 1349 #endif
1213 1350
1214 1351
1215 /* tanh(a + i b) = (tanh(a) + i tan(b)) / (1 - i tanh(a) tan(b)) */ 1352 /* tanh(a + i b) = (tanh(a) + i tan(b)) / (1 + i tanh(a) tan(b)) */
1216 #if !defined(HAVE_CTANHF) 1353 #if !defined(HAVE_CTANHF)
1217 #define HAVE_CTANHF 1 1354 #define HAVE_CTANHF 1
1355 float complex ctanhf (float complex a);
1356
1218 float complex 1357 float complex
1219 ctanhf (float complex a) 1358 ctanhf (float complex a)
1220 { 1359 {
1221 float rt, it; 1360 float rt, it;
1222 float complex n, d; 1361 float complex n, d;
1223 1362
1224 rt = tanhf (REALPART (a)); 1363 rt = tanhf (REALPART (a));
1225 it = tanf (IMAGPART (a)); 1364 it = tanf (IMAGPART (a));
1226 COMPLEX_ASSIGN (n, rt, it); 1365 COMPLEX_ASSIGN (n, rt, it);
1227 COMPLEX_ASSIGN (d, 1, - (rt * it)); 1366 COMPLEX_ASSIGN (d, 1, rt * it);
1228 1367
1229 return n / d; 1368 return n / d;
1230 } 1369 }
1231 #endif 1370 #endif
1232 1371
1233 #if !defined(HAVE_CTANH) 1372 #if !defined(HAVE_CTANH)
1234 #define HAVE_CTANH 1 1373 #define HAVE_CTANH 1
1374 double complex ctanh (double complex a);
1235 double complex 1375 double complex
1236 ctanh (double complex a) 1376 ctanh (double complex a)
1237 { 1377 {
1238 double rt, it; 1378 double rt, it;
1239 double complex n, d; 1379 double complex n, d;
1240 1380
1241 rt = tanh (REALPART (a)); 1381 rt = tanh (REALPART (a));
1242 it = tan (IMAGPART (a)); 1382 it = tan (IMAGPART (a));
1243 COMPLEX_ASSIGN (n, rt, it); 1383 COMPLEX_ASSIGN (n, rt, it);
1244 COMPLEX_ASSIGN (d, 1, - (rt * it)); 1384 COMPLEX_ASSIGN (d, 1, rt * it);
1245 1385
1246 return n / d; 1386 return n / d;
1247 } 1387 }
1248 #endif 1388 #endif
1249 1389
1250 #if !defined(HAVE_CTANHL) && defined(HAVE_TANL) && defined(HAVE_TANHL) 1390 #if !defined(HAVE_CTANHL) && defined(HAVE_TANL) && defined(HAVE_TANHL)
1251 #define HAVE_CTANHL 1 1391 #define HAVE_CTANHL 1
1392 long double complex ctanhl (long double complex a);
1393
1252 long double complex 1394 long double complex
1253 ctanhl (long double complex a) 1395 ctanhl (long double complex a)
1254 { 1396 {
1255 long double rt, it; 1397 long double rt, it;
1256 long double complex n, d; 1398 long double complex n, d;
1257 1399
1258 rt = tanhl (REALPART (a)); 1400 rt = tanhl (REALPART (a));
1259 it = tanl (IMAGPART (a)); 1401 it = tanl (IMAGPART (a));
1260 COMPLEX_ASSIGN (n, rt, it); 1402 COMPLEX_ASSIGN (n, rt, it);
1261 COMPLEX_ASSIGN (d, 1, - (rt * it)); 1403 COMPLEX_ASSIGN (d, 1, rt * it);
1262 1404
1263 return n / d; 1405 return n / d;
1264 } 1406 }
1265 #endif 1407 #endif
1266 1408
1267 1409
1268 /* sin(a + i b) = sin(a) cosh(b) + i cos(a) sinh(b) */ 1410 /* sin(a + i b) = sin(a) cosh(b) + i cos(a) sinh(b) */
1269 #if !defined(HAVE_CSINF) 1411 #if !defined(HAVE_CSINF)
1270 #define HAVE_CSINF 1 1412 #define HAVE_CSINF 1
1413 float complex csinf (float complex a);
1414
1271 float complex 1415 float complex
1272 csinf (float complex a) 1416 csinf (float complex a)
1273 { 1417 {
1274 float r, i; 1418 float r, i;
1275 float complex v; 1419 float complex v;
1276 1420
1277 r = REALPART (a); 1421 r = REALPART (a);
1278 i = IMAGPART (a); 1422 i = IMAGPART (a);
1279 COMPLEX_ASSIGN (v, sinf (r) * coshf (i), cosf (r) * sinhf (i)); 1423 COMPLEX_ASSIGN (v, sinf (r) * coshf (i), cosf (r) * sinhf (i));
1280 return v; 1424 return v;
1281 } 1425 }
1282 #endif 1426 #endif
1283 1427
1284 #if !defined(HAVE_CSIN) 1428 #if !defined(HAVE_CSIN)
1285 #define HAVE_CSIN 1 1429 #define HAVE_CSIN 1
1430 double complex csin (double complex a);
1431
1286 double complex 1432 double complex
1287 csin (double complex a) 1433 csin (double complex a)
1288 { 1434 {
1289 double r, i; 1435 double r, i;
1290 double complex v; 1436 double complex v;
1291 1437
1292 r = REALPART (a); 1438 r = REALPART (a);
1293 i = IMAGPART (a); 1439 i = IMAGPART (a);
1294 COMPLEX_ASSIGN (v, sin (r) * cosh (i), cos (r) * sinh (i)); 1440 COMPLEX_ASSIGN (v, sin (r) * cosh (i), cos (r) * sinh (i));
1295 return v; 1441 return v;
1296 } 1442 }
1297 #endif 1443 #endif
1298 1444
1299 #if !defined(HAVE_CSINL) && defined(HAVE_COSL) && defined(HAVE_COSHL) && defined (HAVE_SINL) && defined(HAVE_SINHL) 1445 #if !defined(HAVE_CSINL) && defined(HAVE_COSL) && defined(HAVE_COSHL) && defined (HAVE_SINL) && defined(HAVE_SINHL)
1300 #define HAVE_CSINL 1 1446 #define HAVE_CSINL 1
1447 long double complex csinl (long double complex a);
1448
1301 long double complex 1449 long double complex
1302 csinl (long double complex a) 1450 csinl (long double complex a)
1303 { 1451 {
1304 long double r, i; 1452 long double r, i;
1305 long double complex v; 1453 long double complex v;
1306 1454
1307 r = REALPART (a); 1455 r = REALPART (a);
1308 i = IMAGPART (a); 1456 i = IMAGPART (a);
1309 COMPLEX_ASSIGN (v, sinl (r) * coshl (i), cosl (r) * sinhl (i)); 1457 COMPLEX_ASSIGN (v, sinl (r) * coshl (i), cosl (r) * sinhl (i));
1310 return v; 1458 return v;
1311 } 1459 }
1312 #endif 1460 #endif
1313 1461
1314 1462
1315 /* cos(a + i b) = cos(a) cosh(b) - i sin(a) sinh(b) */ 1463 /* cos(a + i b) = cos(a) cosh(b) - i sin(a) sinh(b) */
1316 #if !defined(HAVE_CCOSF) 1464 #if !defined(HAVE_CCOSF)
1317 #define HAVE_CCOSF 1 1465 #define HAVE_CCOSF 1
1466 float complex ccosf (float complex a);
1467
1318 float complex 1468 float complex
1319 ccosf (float complex a) 1469 ccosf (float complex a)
1320 { 1470 {
1321 float r, i; 1471 float r, i;
1322 float complex v; 1472 float complex v;
1323 1473
1324 r = REALPART (a); 1474 r = REALPART (a);
1325 i = IMAGPART (a); 1475 i = IMAGPART (a);
1326 COMPLEX_ASSIGN (v, cosf (r) * coshf (i), - (sinf (r) * sinhf (i))); 1476 COMPLEX_ASSIGN (v, cosf (r) * coshf (i), - (sinf (r) * sinhf (i)));
1327 return v; 1477 return v;
1328 } 1478 }
1329 #endif 1479 #endif
1330 1480
1331 #if !defined(HAVE_CCOS) 1481 #if !defined(HAVE_CCOS)
1332 #define HAVE_CCOS 1 1482 #define HAVE_CCOS 1
1483 double complex ccos (double complex a);
1484
1333 double complex 1485 double complex
1334 ccos (double complex a) 1486 ccos (double complex a)
1335 { 1487 {
1336 double r, i; 1488 double r, i;
1337 double complex v; 1489 double complex v;
1338 1490
1339 r = REALPART (a); 1491 r = REALPART (a);
1340 i = IMAGPART (a); 1492 i = IMAGPART (a);
1341 COMPLEX_ASSIGN (v, cos (r) * cosh (i), - (sin (r) * sinh (i))); 1493 COMPLEX_ASSIGN (v, cos (r) * cosh (i), - (sin (r) * sinh (i)));
1342 return v; 1494 return v;
1343 } 1495 }
1344 #endif 1496 #endif
1345 1497
1346 #if !defined(HAVE_CCOSL) && defined(HAVE_COSL) && defined(HAVE_COSHL) && defined (HAVE_SINL) && defined(HAVE_SINHL) 1498 #if !defined(HAVE_CCOSL) && defined(HAVE_COSL) && defined(HAVE_COSHL) && defined (HAVE_SINL) && defined(HAVE_SINHL)
1347 #define HAVE_CCOSL 1 1499 #define HAVE_CCOSL 1
1500 long double complex ccosl (long double complex a);
1501
1348 long double complex 1502 long double complex
1349 ccosl (long double complex a) 1503 ccosl (long double complex a)
1350 { 1504 {
1351 long double r, i; 1505 long double r, i;
1352 long double complex v; 1506 long double complex v;
1353 1507
1354 r = REALPART (a); 1508 r = REALPART (a);
1355 i = IMAGPART (a); 1509 i = IMAGPART (a);
1356 COMPLEX_ASSIGN (v, cosl (r) * coshl (i), - (sinl (r) * sinhl (i))); 1510 COMPLEX_ASSIGN (v, cosl (r) * coshl (i), - (sinl (r) * sinhl (i)));
1357 return v; 1511 return v;
1358 } 1512 }
1359 #endif 1513 #endif
1360 1514
1361 1515
1362 /* tan(a + i b) = (tan(a) + i tanh(b)) / (1 - i tan(a) tanh(b)) */ 1516 /* tan(a + i b) = (tan(a) + i tanh(b)) / (1 - i tan(a) tanh(b)) */
1363 #if !defined(HAVE_CTANF) 1517 #if !defined(HAVE_CTANF)
1364 #define HAVE_CTANF 1 1518 #define HAVE_CTANF 1
1519 float complex ctanf (float complex a);
1520
1365 float complex 1521 float complex
1366 ctanf (float complex a) 1522 ctanf (float complex a)
1367 { 1523 {
1368 float rt, it; 1524 float rt, it;
1369 float complex n, d; 1525 float complex n, d;
1370 1526
1371 rt = tanf (REALPART (a)); 1527 rt = tanf (REALPART (a));
1372 it = tanhf (IMAGPART (a)); 1528 it = tanhf (IMAGPART (a));
1373 COMPLEX_ASSIGN (n, rt, it); 1529 COMPLEX_ASSIGN (n, rt, it);
1374 COMPLEX_ASSIGN (d, 1, - (rt * it)); 1530 COMPLEX_ASSIGN (d, 1, - (rt * it));
1375 1531
1376 return n / d; 1532 return n / d;
1377 } 1533 }
1378 #endif 1534 #endif
1379 1535
1380 #if !defined(HAVE_CTAN) 1536 #if !defined(HAVE_CTAN)
1381 #define HAVE_CTAN 1 1537 #define HAVE_CTAN 1
1538 double complex ctan (double complex a);
1539
1382 double complex 1540 double complex
1383 ctan (double complex a) 1541 ctan (double complex a)
1384 { 1542 {
1385 double rt, it; 1543 double rt, it;
1386 double complex n, d; 1544 double complex n, d;
1387 1545
1388 rt = tan (REALPART (a)); 1546 rt = tan (REALPART (a));
1389 it = tanh (IMAGPART (a)); 1547 it = tanh (IMAGPART (a));
1390 COMPLEX_ASSIGN (n, rt, it); 1548 COMPLEX_ASSIGN (n, rt, it);
1391 COMPLEX_ASSIGN (d, 1, - (rt * it)); 1549 COMPLEX_ASSIGN (d, 1, - (rt * it));
1392 1550
1393 return n / d; 1551 return n / d;
1394 } 1552 }
1395 #endif 1553 #endif
1396 1554
1397 #if !defined(HAVE_CTANL) && defined(HAVE_TANL) && defined(HAVE_TANHL) 1555 #if !defined(HAVE_CTANL) && defined(HAVE_TANL) && defined(HAVE_TANHL)
1398 #define HAVE_CTANL 1 1556 #define HAVE_CTANL 1
1557 long double complex ctanl (long double complex a);
1558
1399 long double complex 1559 long double complex
1400 ctanl (long double complex a) 1560 ctanl (long double complex a)
1401 { 1561 {
1402 long double rt, it; 1562 long double rt, it;
1403 long double complex n, d; 1563 long double complex n, d;
1404 1564
1405 rt = tanl (REALPART (a)); 1565 rt = tanl (REALPART (a));
1406 it = tanhl (IMAGPART (a)); 1566 it = tanhl (IMAGPART (a));
1407 COMPLEX_ASSIGN (n, rt, it); 1567 COMPLEX_ASSIGN (n, rt, it);
1408 COMPLEX_ASSIGN (d, 1, - (rt * it)); 1568 COMPLEX_ASSIGN (d, 1, - (rt * it));
1409 1569
1410 return n / d; 1570 return n / d;
1411 } 1571 }
1412 #endif 1572 #endif
1413 1573
1414 1574
1575 /* Complex ASIN. Returns wrongly NaN for infinite arguments.
1576 Algorithm taken from Abramowitz & Stegun. */
1577
1578 #if !defined(HAVE_CASINF) && defined(HAVE_CLOGF) && defined(HAVE_CSQRTF)
1579 #define HAVE_CASINF 1
1580 complex float casinf (complex float z);
1581
1582 complex float
1583 casinf (complex float z)
1584 {
1585 return -I*clogf (I*z + csqrtf (1.0f-z*z));
1586 }
1587 #endif
1588
1589
1590 #if !defined(HAVE_CASIN) && defined(HAVE_CLOG) && defined(HAVE_CSQRT)
1591 #define HAVE_CASIN 1
1592 complex double casin (complex double z);
1593
1594 complex double
1595 casin (complex double z)
1596 {
1597 return -I*clog (I*z + csqrt (1.0-z*z));
1598 }
1599 #endif
1600
1601
1602 #if !defined(HAVE_CASINL) && defined(HAVE_CLOGL) && defined(HAVE_CSQRTL)
1603 #define HAVE_CASINL 1
1604 complex long double casinl (complex long double z);
1605
1606 complex long double
1607 casinl (complex long double z)
1608 {
1609 return -I*clogl (I*z + csqrtl (1.0L-z*z));
1610 }
1611 #endif
1612
1613
1614 /* Complex ACOS. Returns wrongly NaN for infinite arguments.
1615 Algorithm taken from Abramowitz & Stegun. */
1616
1617 #if !defined(HAVE_CACOSF) && defined(HAVE_CLOGF) && defined(HAVE_CSQRTF)
1618 #define HAVE_CACOSF 1
1619 complex float cacosf (complex float z);
1620
1621 complex float
1622 cacosf (complex float z)
1623 {
1624 return -I*clogf (z + I*csqrtf (1.0f-z*z));
1625 }
1626 #endif
1627
1628
1629 #if !defined(HAVE_CACOS) && defined(HAVE_CLOG) && defined(HAVE_CSQRT)
1630 #define HAVE_CACOS 1
1631 complex double cacos (complex double z);
1632
1633 complex double
1634 cacos (complex double z)
1635 {
1636 return -I*clog (z + I*csqrt (1.0-z*z));
1637 }
1638 #endif
1639
1640
1641 #if !defined(HAVE_CACOSL) && defined(HAVE_CLOGL) && defined(HAVE_CSQRTL)
1642 #define HAVE_CACOSL 1
1643 complex long double cacosl (complex long double z);
1644
1645 complex long double
1646 cacosl (complex long double z)
1647 {
1648 return -I*clogl (z + I*csqrtl (1.0L-z*z));
1649 }
1650 #endif
1651
1652
1653 /* Complex ATAN. Returns wrongly NaN for infinite arguments.
1654 Algorithm taken from Abramowitz & Stegun. */
1655
1656 #if !defined(HAVE_CATANF) && defined(HAVE_CLOGF)
1657 #define HAVE_CACOSF 1
1658 complex float catanf (complex float z);
1659
1660 complex float
1661 catanf (complex float z)
1662 {
1663 return I*clogf ((I+z)/(I-z))/2.0f;
1664 }
1665 #endif
1666
1667
1668 #if !defined(HAVE_CATAN) && defined(HAVE_CLOG)
1669 #define HAVE_CACOS 1
1670 complex double catan (complex double z);
1671
1672 complex double
1673 catan (complex double z)
1674 {
1675 return I*clog ((I+z)/(I-z))/2.0;
1676 }
1677 #endif
1678
1679
1680 #if !defined(HAVE_CATANL) && defined(HAVE_CLOGL)
1681 #define HAVE_CACOSL 1
1682 complex long double catanl (complex long double z);
1683
1684 complex long double
1685 catanl (complex long double z)
1686 {
1687 return I*clogl ((I+z)/(I-z))/2.0L;
1688 }
1689 #endif
1690
1691
1692 /* Complex ASINH. Returns wrongly NaN for infinite arguments.
1693 Algorithm taken from Abramowitz & Stegun. */
1694
1695 #if !defined(HAVE_CASINHF) && defined(HAVE_CLOGF) && defined(HAVE_CSQRTF)
1696 #define HAVE_CASINHF 1
1697 complex float casinhf (complex float z);
1698
1699 complex float
1700 casinhf (complex float z)
1701 {
1702 return clogf (z + csqrtf (z*z+1.0f));
1703 }
1704 #endif
1705
1706
1707 #if !defined(HAVE_CASINH) && defined(HAVE_CLOG) && defined(HAVE_CSQRT)
1708 #define HAVE_CASINH 1
1709 complex double casinh (complex double z);
1710
1711 complex double
1712 casinh (complex double z)
1713 {
1714 return clog (z + csqrt (z*z+1.0));
1715 }
1716 #endif
1717
1718
1719 #if !defined(HAVE_CASINHL) && defined(HAVE_CLOGL) && defined(HAVE_CSQRTL)
1720 #define HAVE_CASINHL 1
1721 complex long double casinhl (complex long double z);
1722
1723 complex long double
1724 casinhl (complex long double z)
1725 {
1726 return clogl (z + csqrtl (z*z+1.0L));
1727 }
1728 #endif
1729
1730
1731 /* Complex ACOSH. Returns wrongly NaN for infinite arguments.
1732 Algorithm taken from Abramowitz & Stegun. */
1733
1734 #if !defined(HAVE_CACOSHF) && defined(HAVE_CLOGF) && defined(HAVE_CSQRTF)
1735 #define HAVE_CACOSHF 1
1736 complex float cacoshf (complex float z);
1737
1738 complex float
1739 cacoshf (complex float z)
1740 {
1741 return clogf (z + csqrtf (z-1.0f) * csqrtf (z+1.0f));
1742 }
1743 #endif
1744
1745
1746 #if !defined(HAVE_CACOSH) && defined(HAVE_CLOG) && defined(HAVE_CSQRT)
1747 #define HAVE_CACOSH 1
1748 complex double cacosh (complex double z);
1749
1750 complex double
1751 cacosh (complex double z)
1752 {
1753 return clog (z + csqrt (z-1.0) * csqrt (z+1.0));
1754 }
1755 #endif
1756
1757
1758 #if !defined(HAVE_CACOSHL) && defined(HAVE_CLOGL) && defined(HAVE_CSQRTL)
1759 #define HAVE_CACOSHL 1
1760 complex long double cacoshl (complex long double z);
1761
1762 complex long double
1763 cacoshl (complex long double z)
1764 {
1765 return clogl (z + csqrtl (z-1.0L) * csqrtl (z+1.0L));
1766 }
1767 #endif
1768
1769
1770 /* Complex ATANH. Returns wrongly NaN for infinite arguments.
1771 Algorithm taken from Abramowitz & Stegun. */
1772
1773 #if !defined(HAVE_CATANHF) && defined(HAVE_CLOGF)
1774 #define HAVE_CATANHF 1
1775 complex float catanhf (complex float z);
1776
1777 complex float
1778 catanhf (complex float z)
1779 {
1780 return clogf ((1.0f+z)/(1.0f-z))/2.0f;
1781 }
1782 #endif
1783
1784
1785 #if !defined(HAVE_CATANH) && defined(HAVE_CLOG)
1786 #define HAVE_CATANH 1
1787 complex double catanh (complex double z);
1788
1789 complex double
1790 catanh (complex double z)
1791 {
1792 return clog ((1.0+z)/(1.0-z))/2.0;
1793 }
1794 #endif
1795
1796 #if !defined(HAVE_CATANHL) && defined(HAVE_CLOGL)
1797 #define HAVE_CATANHL 1
1798 complex long double catanhl (complex long double z);
1799
1800 complex long double
1801 catanhl (complex long double z)
1802 {
1803 return clogl ((1.0L+z)/(1.0L-z))/2.0L;
1804 }
1805 #endif
1806
1807
1415 #if !defined(HAVE_TGAMMA) 1808 #if !defined(HAVE_TGAMMA)
1416 #define HAVE_TGAMMA 1 1809 #define HAVE_TGAMMA 1
1417 1810 double tgamma (double);
1418 extern double tgamma (double);
1419 1811
1420 /* Fallback tgamma() function. Uses the algorithm from 1812 /* Fallback tgamma() function. Uses the algorithm from
1421 http://www.netlib.org/specfun/gamma and references therein. */ 1813 http://www.netlib.org/specfun/gamma and references therein. */
1422 1814
1423 #undef SQRTPI 1815 #undef SQRTPI
1424 #define SQRTPI 0.9189385332046727417803297 1816 #define SQRTPI 0.9189385332046727417803297
1425 1817
1426 #undef PI 1818 #undef PI
1427 #define PI 3.1415926535897932384626434 1819 #define PI 3.1415926535897932384626434
1428 1820
(...skipping 19 matching lines...) Expand all
1448 8.4171387781295e-04, -5.952379913043012e-04, 1840 8.4171387781295e-04, -5.952379913043012e-04,
1449 7.93650793500350248e-04, -2.777777777777681622553e-03, 1841 7.93650793500350248e-04, -2.777777777777681622553e-03,
1450 8.333333333333333331554247e-02, 5.7083835261e-03 }; 1842 8.333333333333333331554247e-02, 5.7083835261e-03 };
1451 1843
1452 static const double xminin = 2.23e-308; 1844 static const double xminin = 2.23e-308;
1453 static const double xbig = 171.624; 1845 static const double xbig = 171.624;
1454 static const double xnan = __builtin_nan ("0x0"), xinf = __builtin_inf (); 1846 static const double xnan = __builtin_nan ("0x0"), xinf = __builtin_inf ();
1455 static double eps = 0; 1847 static double eps = 0;
1456 1848
1457 if (eps == 0) 1849 if (eps == 0)
1458 eps = nextafter(1., 2.) - 1.; 1850 eps = nextafter (1., 2.) - 1.;
1459 1851
1460 parity = 0; 1852 parity = 0;
1461 fact = 1; 1853 fact = 1;
1462 n = 0; 1854 n = 0;
1463 y = x; 1855 y = x;
1464 1856
1465 if (__builtin_isnan (x)) 1857 if (__builtin_isnan (x))
1466 return x; 1858 return x;
1467 1859
1468 if (y <= 0) 1860 if (y <= 0)
1469 { 1861 {
1470 y = -x; 1862 y = -x;
1471 y1 = trunc(y); 1863 y1 = trunc (y);
1472 res = y - y1; 1864 res = y - y1;
1473 1865
1474 if (res != 0) 1866 if (res != 0)
1475 { 1867 {
1476 » if (y1 != trunc(y1*0.5l)*2) 1868 » if (y1 != trunc (y1*0.5l)*2)
1477 parity = 1; 1869 parity = 1;
1478 » fact = -PI / sin(PI*res); 1870 » fact = -PI / sin (PI*res);
1479 y = y + 1; 1871 y = y + 1;
1480 } 1872 }
1481 else 1873 else
1482 return x == 0 ? copysign (xinf, x) : xnan; 1874 return x == 0 ? copysign (xinf, x) : xnan;
1483 } 1875 }
1484 1876
1485 if (y < eps) 1877 if (y < eps)
1486 { 1878 {
1487 if (y >= xminin) 1879 if (y >= xminin)
1488 res = 1 / y; 1880 res = 1 / y;
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after
1526 else 1918 else
1527 { 1919 {
1528 if (y < xbig) 1920 if (y < xbig)
1529 { 1921 {
1530 ysq = y * y; 1922 ysq = y * y;
1531 sum = c[6]; 1923 sum = c[6];
1532 for (i = 0; i < 6; i++) 1924 for (i = 0; i < 6; i++)
1533 sum = sum / ysq + c[i]; 1925 sum = sum / ysq + c[i];
1534 1926
1535 sum = sum/y - y + SQRTPI; 1927 sum = sum/y - y + SQRTPI;
1536 » sum = sum + (y - 0.5) * log(y); 1928 » sum = sum + (y - 0.5) * log (y);
1537 » res = exp(sum); 1929 » res = exp (sum);
1538 } 1930 }
1539 else 1931 else
1540 return x < 0 ? xnan : xinf; 1932 return x < 0 ? xnan : xinf;
1541 } 1933 }
1542 1934
1543 if (parity) 1935 if (parity)
1544 res = -res; 1936 res = -res;
1545 if (fact != 1) 1937 if (fact != 1)
1546 res = fact / res; 1938 res = fact / res;
1547 1939
1548 return res; 1940 return res;
1549 } 1941 }
1550 #endif 1942 #endif
1551 1943
1552 1944
1553 1945
1554 #if !defined(HAVE_LGAMMA) 1946 #if !defined(HAVE_LGAMMA)
1555 #define HAVE_LGAMMA 1 1947 #define HAVE_LGAMMA 1
1556 1948 double lgamma (double);
1557 extern double lgamma (double);
1558 1949
1559 /* Fallback lgamma() function. Uses the algorithm from 1950 /* Fallback lgamma() function. Uses the algorithm from
1560 http://www.netlib.org/specfun/algama and references therein, 1951 http://www.netlib.org/specfun/algama and references therein,
1561 except for negative arguments (where netlib would return +Inf) 1952 except for negative arguments (where netlib would return +Inf)
1562 where we use the following identity: 1953 where we use the following identity:
1563 lgamma(y) = log(pi/(|y*sin(pi*y)|)) - lgamma(-y) 1954 lgamma(y) = log(pi/(|y*sin(pi*y)|)) - lgamma(-y)
1564 */ 1955 */
1565 1956
1566 double 1957 double
1567 lgamma (double y) 1958 lgamma (double y)
(...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after
1614 -2.777777777777681622553e-03, 8.333333333333333331554247e-02, 2005 -2.777777777777681622553e-03, 8.333333333333333331554247e-02,
1615 5.7083835261e-03 }; 2006 5.7083835261e-03 };
1616 2007
1617 static double xbig = 2.55e305, xinf = __builtin_inf (), eps = 0, 2008 static double xbig = 2.55e305, xinf = __builtin_inf (), eps = 0,
1618 frtbig = 2.25e76; 2009 frtbig = 2.25e76;
1619 2010
1620 int i; 2011 int i;
1621 double corr, res, xden, xm1, xm2, xm4, xnum, ysq; 2012 double corr, res, xden, xm1, xm2, xm4, xnum, ysq;
1622 2013
1623 if (eps == 0) 2014 if (eps == 0)
1624 eps = __builtin_nextafter(1., 2.) - 1.; 2015 eps = __builtin_nextafter (1., 2.) - 1.;
1625 2016
1626 if ((y > 0) && (y <= xbig)) 2017 if ((y > 0) && (y <= xbig))
1627 { 2018 {
1628 if (y <= eps) 2019 if (y <= eps)
1629 » res = -log(y); 2020 » res = -log (y);
1630 else if (y <= 1.5) 2021 else if (y <= 1.5)
1631 { 2022 {
1632 if (y < PNT68) 2023 if (y < PNT68)
1633 { 2024 {
1634 » corr = -log(y); 2025 » corr = -log (y);
1635 xm1 = y; 2026 xm1 = y;
1636 } 2027 }
1637 else 2028 else
1638 { 2029 {
1639 corr = 0; 2030 corr = 0;
1640 xm1 = (y - 0.5) - 0.5; 2031 xm1 = (y - 0.5) - 0.5;
1641 } 2032 }
1642 2033
1643 if ((y <= 0.5) || (y >= PNT68)) 2034 if ((y <= 0.5) || (y >= PNT68))
1644 { 2035 {
(...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after
1692 { 2083 {
1693 res = 0; 2084 res = 0;
1694 if (y <= frtbig) 2085 if (y <= frtbig)
1695 { 2086 {
1696 res = c[6]; 2087 res = c[6];
1697 ysq = y * y; 2088 ysq = y * y;
1698 for (i = 0; i < 6; i++) 2089 for (i = 0; i < 6; i++)
1699 res = res / ysq + c[i]; 2090 res = res / ysq + c[i];
1700 } 2091 }
1701 res = res/y; 2092 res = res/y;
1702 » corr = log(y); 2093 » corr = log (y);
1703 res = res + SQRTPI - 0.5*corr; 2094 res = res + SQRTPI - 0.5*corr;
1704 res = res + y*(corr-1); 2095 res = res + y*(corr-1);
1705 } 2096 }
1706 } 2097 }
1707 else if (y < 0 && __builtin_floor (y) != y) 2098 else if (y < 0 && __builtin_floor (y) != y)
1708 { 2099 {
1709 /* lgamma(y) = log(pi/(|y*sin(pi*y)|)) - lgamma(-y) 2100 /* lgamma(y) = log(pi/(|y*sin(pi*y)|)) - lgamma(-y)
1710 For abs(y) very close to zero, we use a series expansion to 2101 For abs(y) very close to zero, we use a series expansion to
1711 the first order in y to avoid overflow. */ 2102 the first order in y to avoid overflow. */
1712 if (y > -1.e-100) 2103 if (y > -1.e-100)
1713 res = -2 * log (fabs (y)) - lgamma (-y); 2104 res = -2 * log (fabs (y)) - lgamma (-y);
1714 else 2105 else
1715 res = log (PI / fabs (y * sin (PI * y))) - lgamma (-y); 2106 res = log (PI / fabs (y * sin (PI * y))) - lgamma (-y);
1716 } 2107 }
1717 else 2108 else
1718 res = xinf; 2109 res = xinf;
1719 2110
1720 return res; 2111 return res;
1721 } 2112 }
1722 #endif 2113 #endif
1723 2114
1724 2115
1725 #if defined(HAVE_TGAMMA) && !defined(HAVE_TGAMMAF) 2116 #if defined(HAVE_TGAMMA) && !defined(HAVE_TGAMMAF)
1726 #define HAVE_TGAMMAF 1 2117 #define HAVE_TGAMMAF 1
1727 extern float tgammaf (float); 2118 float tgammaf (float);
1728 2119
1729 float 2120 float
1730 tgammaf (float x) 2121 tgammaf (float x)
1731 { 2122 {
1732 return (float) tgamma ((double) x); 2123 return (float) tgamma ((double) x);
1733 } 2124 }
1734 #endif 2125 #endif
1735 2126
1736 #if defined(HAVE_LGAMMA) && !defined(HAVE_LGAMMAF) 2127 #if defined(HAVE_LGAMMA) && !defined(HAVE_LGAMMAF)
1737 #define HAVE_LGAMMAF 1 2128 #define HAVE_LGAMMAF 1
1738 extern float lgammaf (float); 2129 float lgammaf (float);
1739 2130
1740 float 2131 float
1741 lgammaf (float x) 2132 lgammaf (float x)
1742 { 2133 {
1743 return (float) lgamma ((double) x); 2134 return (float) lgamma ((double) x);
1744 } 2135 }
1745 #endif 2136 #endif
OLDNEW
« no previous file with comments | « gcc/libgfortran/intrinsics/args.c ('k') | gcc/libgfortran/intrinsics/cshift0.c » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698