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