1 /* Implementation of various C99 functions
2 Copyright (C) 2004-2014 Free Software Foundation, Inc.
4 This file is part of the GNU Fortran 95 runtime library (libgfortran).
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.
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.
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.
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/>. */
27 #define C99_PROTOS_H WE_DONT_WANT_PROTOS_NOW
28 #include "libgfortran.h"
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. */
33 # if defined(_Imaginary_I)
34 # define I _Imaginary_I
35 # elif defined(_Complex_I)
42 /* Macros to get real and imaginary parts of a complex, and set
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_);}
49 /* Prototypes are included to silence -Wstrict-prototypes
50 -Wmissing-prototypes. */
53 /* Wrappers for systems without the various C99 single precision Bessel
56 #if defined(HAVE_J0) && ! defined(HAVE_J0F)
63 return (float) j0 ((double) x
);
67 #if defined(HAVE_J1) && !defined(HAVE_J1F)
73 return (float) j1 ((double) x
);
77 #if defined(HAVE_JN) && !defined(HAVE_JNF)
79 float jnf (int, float);
84 return (float) jn (n
, (double) x
);
88 #if defined(HAVE_Y0) && !defined(HAVE_Y0F)
95 return (float) y0 ((double) x
);
99 #if defined(HAVE_Y1) && !defined(HAVE_Y1F)
106 return (float) y1 ((double) x
);
110 #if defined(HAVE_YN) && !defined(HAVE_YNF)
112 float ynf (int, float);
117 return (float) yn (n
, (double) x
);
122 /* Wrappers for systems without the C99 erff() and erfcf() functions. */
124 #if defined(HAVE_ERF) && !defined(HAVE_ERFF)
131 return (float) erf ((double) x
);
135 #if defined(HAVE_ERFC) && !defined(HAVE_ERFCF)
142 return (float) erfc ((double) x
);
149 float acosf (float x
);
154 return (float) acos (x
);
158 #if HAVE_ACOSH && !HAVE_ACOSHF
159 float acoshf (float x
);
164 return (float) acosh ((double) x
);
170 float asinf (float x
);
175 return (float) asin (x
);
179 #if HAVE_ASINH && !HAVE_ASINHF
180 float asinhf (float x
);
185 return (float) asinh ((double) x
);
190 #define HAVE_ATAN2F 1
191 float atan2f (float y
, float x
);
194 atan2f (float y
, float x
)
196 return (float) atan2 (y
, x
);
202 float atanf (float x
);
207 return (float) atan (x
);
211 #if HAVE_ATANH && !HAVE_ATANHF
212 float atanhf (float x
);
217 return (float) atanh ((double) x
);
223 float ceilf (float x
);
228 return (float) ceil (x
);
232 #ifndef HAVE_COPYSIGNF
233 #define HAVE_COPYSIGNF 1
234 float copysignf (float x
, float y
);
237 copysignf (float x
, float y
)
239 return (float) copysign (x
, y
);
245 float cosf (float x
);
250 return (float) cos (x
);
256 float coshf (float x
);
261 return (float) cosh (x
);
267 float expf (float x
);
272 return (float) exp (x
);
278 float fabsf (float x
);
283 return (float) fabs (x
);
288 #define HAVE_FLOORF 1
289 float floorf (float x
);
294 return (float) floor (x
);
300 float fmodf (float x
, float y
);
303 fmodf (float x
, float y
)
305 return (float) fmod (x
, y
);
310 #define HAVE_FREXPF 1
311 float frexpf (float x
, int *exp
);
314 frexpf (float x
, int *exp
)
316 return (float) frexp (x
, exp
);
321 #define HAVE_HYPOTF 1
322 float hypotf (float x
, float y
);
325 hypotf (float x
, float y
)
327 return (float) hypot (x
, y
);
333 float logf (float x
);
338 return (float) log (x
);
343 #define HAVE_LOG10F 1
344 float log10f (float x
);
349 return (float) log10 (x
);
354 #define HAVE_SCALBN 1
355 double scalbn (double x
, int y
);
358 scalbn (double x
, int y
)
360 #if (FLT_RADIX == 2) && defined(HAVE_LDEXP)
363 return x
* pow (FLT_RADIX
, y
);
369 #define HAVE_SCALBNF 1
370 float scalbnf (float x
, int y
);
373 scalbnf (float x
, int y
)
375 return (float) scalbn (x
, y
);
381 float sinf (float x
);
386 return (float) sin (x
);
392 float sinhf (float x
);
397 return (float) sinh (x
);
403 float sqrtf (float x
);
408 return (float) sqrt (x
);
414 float tanf (float x
);
419 return (float) tan (x
);
425 float tanhf (float x
);
430 return (float) tanh (x
);
436 double trunc (double x
);
452 #define HAVE_TRUNCF 1
453 float truncf (float x
);
458 return (float) trunc (x
);
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
);
470 nextafterf (float x
, float y
)
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
;
477 if (isnan (x
) || isnan (y
))
482 return x
> 0 ? __FLT_MAX__
: - __FLT_MAX__
;
484 /* absx = fabsf (x); */
485 absx
= (x
< 0.0) ? -x
: x
;
487 /* __FLT_DENORM_MIN__ is non-zero iff the target supports denormals. */
488 if (__FLT_DENORM_MIN__
== 0.0f
)
489 denorm_min
= __FLT_MIN__
;
491 denorm_min
= __FLT_DENORM_MIN__
;
493 if (absx
< __FLT_MIN__
)
500 /* Discard the fraction from x. */
501 frac
= frexpf (absx
, &exp
);
502 delta
= scalbnf (0.5f
, exp
);
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__
;
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))
515 /* If that underflows to zero, then we're back to the minimum. */
530 float powf (float x
, float y
);
533 powf (float x
, float y
)
535 return (float) pow (x
, y
);
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
);
571 /* Algorithm by Steven G. Kargl. */
573 #if !defined(HAVE_ROUNDL)
574 #define HAVE_ROUNDL 1
575 long double roundl (long double x
);
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. */
582 roundl (long double x
)
605 /* Poor version of roundl for system that don't have ceill. */
607 roundl (long double x
)
609 if (x
> DBL_MAX
|| x
< -DBL_MAX
)
611 #ifdef HAVE_NEXTAFTERL
612 long double prechalf
= nextafterl (0.5L, LDBL_MAX
);
614 static long double prechalf
= 0.5L;
616 return (GFC_INTEGER_LARGEST
) (x
+ (x
> 0 ? prechalf
: -prechalf
));
620 return round ((double) x
);
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
);
657 /* lround{f,,l} and llround{f,,l} functions. */
659 #if !defined(HAVE_LROUNDF) && defined(HAVE_ROUNDF)
660 #define HAVE_LROUNDF 1
661 long int lroundf (float x
);
666 return (long int) roundf (x
);
670 #if !defined(HAVE_LROUND) && defined(HAVE_ROUND)
671 #define HAVE_LROUND 1
672 long int lround (double x
);
677 return (long int) round (x
);
681 #if !defined(HAVE_LROUNDL) && defined(HAVE_ROUNDL)
682 #define HAVE_LROUNDL 1
683 long int lroundl (long double x
);
686 lroundl (long double x
)
688 return (long long int) roundl (x
);
692 #if !defined(HAVE_LLROUNDF) && defined(HAVE_ROUNDF)
693 #define HAVE_LLROUNDF 1
694 long long int llroundf (float x
);
699 return (long long int) roundf (x
);
703 #if !defined(HAVE_LLROUND) && defined(HAVE_ROUND)
704 #define HAVE_LLROUND 1
705 long long int llround (double x
);
710 return (long long int) round (x
);
714 #if !defined(HAVE_LLROUNDL) && defined(HAVE_ROUNDL)
715 #define HAVE_LLROUNDL 1
716 long long int llroundl (long double x
);
719 llroundl (long double x
)
721 return (long long int) roundl (x
);
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
);
733 log10l (long double x
)
735 #if LDBL_MAX_EXP > DBL_MAX_EXP
740 if (x
> 0x1p
16383L) { p2_result
+= 16383; x
/= 0x1p
16383L; }
741 if (x
> 0x1p
8191L) { p2_result
+= 8191; x
/= 0x1p
8191L; }
742 if (x
> 0x1p
4095L) { p2_result
+= 4095; x
/= 0x1p
4095L; }
743 if (x
> 0x1p
2047L) { p2_result
+= 2047; x
/= 0x1p
2047L; }
744 if (x
> 0x1p
1023L) { p2_result
+= 1023; x
/= 0x1p
1023L; }
745 val
= log10 ((double) x
);
746 return (val
+ p2_result
* .30102999566398119521373889472449302L);
749 #if LDBL_MIN_EXP < DBL_MIN_EXP
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);
769 #define HAVE_FLOORL 1
770 long double floorl (long double x
);
773 floorl (long double x
)
775 /* Zero, possibly signed. */
779 /* Large magnitude. */
780 if (x
> DBL_MAX
|| x
< (-DBL_MAX
))
783 /* Small positive values. */
784 if (x
>= 0 && x
< DBL_MIN
)
787 /* Small negative values. */
788 if (x
< 0 && x
> (-DBL_MIN
))
798 long double fmodl (long double x
, long double y
);
801 fmodl (long double x
, long double y
)
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
;
813 #if !defined(HAVE_CABSF)
815 float cabsf (float complex z
);
818 cabsf (float complex z
)
820 return hypotf (REALPART (z
), IMAGPART (z
));
824 #if !defined(HAVE_CABS)
826 double cabs (double complex z
);
829 cabs (double complex z
)
831 return hypot (REALPART (z
), IMAGPART (z
));
835 #if !defined(HAVE_CABSL) && defined(HAVE_HYPOTL)
837 long double cabsl (long double complex z
);
840 cabsl (long double complex z
)
842 return hypotl (REALPART (z
), IMAGPART (z
));
847 #if !defined(HAVE_CARGF)
849 float cargf (float complex z
);
852 cargf (float complex z
)
854 return atan2f (IMAGPART (z
), REALPART (z
));
858 #if !defined(HAVE_CARG)
860 double carg (double complex z
);
863 carg (double complex z
)
865 return atan2 (IMAGPART (z
), REALPART (z
));
869 #if !defined(HAVE_CARGL) && defined(HAVE_ATAN2L)
871 long double cargl (long double complex z
);
874 cargl (long double complex z
)
876 return atan2l (IMAGPART (z
), REALPART (z
));
881 /* exp(z) = exp(a)*(cos(b) + i sin(b)) */
882 #if !defined(HAVE_CEXPF)
884 float complex cexpf (float complex z
);
887 cexpf (float complex z
)
894 COMPLEX_ASSIGN (v
, cosf (b
), sinf (b
));
899 #if !defined(HAVE_CEXP)
901 double complex cexp (double complex z
);
904 cexp (double complex z
)
911 COMPLEX_ASSIGN (v
, cos (b
), sin (b
));
916 #if !defined(HAVE_CEXPL) && defined(HAVE_COSL) && defined(HAVE_SINL) && defined(EXPL)
918 long double complex cexpl (long double complex z
);
921 cexpl (long double complex z
)
924 long double complex v
;
928 COMPLEX_ASSIGN (v
, cosl (b
), sinl (b
));
934 /* log(z) = log (cabs(z)) + i*carg(z) */
935 #if !defined(HAVE_CLOGF)
937 float complex clogf (float complex z
);
940 clogf (float complex z
)
944 COMPLEX_ASSIGN (v
, logf (cabsf (z
)), cargf (z
));
949 #if !defined(HAVE_CLOG)
951 double complex clog (double complex z
);
954 clog (double complex z
)
958 COMPLEX_ASSIGN (v
, log (cabs (z
)), carg (z
));
963 #if !defined(HAVE_CLOGL) && defined(HAVE_LOGL) && defined(HAVE_CABSL) && defined(HAVE_CARGL)
965 long double complex clogl (long double complex z
);
968 clogl (long double complex z
)
970 long double complex v
;
972 COMPLEX_ASSIGN (v
, logl (cabsl (z
)), cargl (z
));
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
);
984 clog10f (float complex z
)
988 COMPLEX_ASSIGN (v
, log10f (cabsf (z
)), cargf (z
));
993 #if !defined(HAVE_CLOG10)
994 #define HAVE_CLOG10 1
995 double complex clog10 (double complex z
);
998 clog10 (double complex z
)
1002 COMPLEX_ASSIGN (v
, log10 (cabs (z
)), carg (z
));
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
);
1012 clog10l (long double complex z
)
1014 long double complex v
;
1016 COMPLEX_ASSIGN (v
, log10l (cabsl (z
)), cargl (z
));
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
);
1028 cpowf (float complex base
, float complex power
)
1030 return cexpf (power
* clogf (base
));
1034 #if !defined(HAVE_CPOW)
1036 double complex cpow (double complex base
, double complex power
);
1039 cpow (double complex base
, double complex power
)
1041 return cexp (power
* clog (base
));
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
);
1050 cpowl (long double complex base
, long double complex power
)
1052 return cexpl (power
* clogl (base
));
1057 /* sqrt(z). Algorithm pulled from glibc. */
1058 #if !defined(HAVE_CSQRTF)
1059 #define HAVE_CSQRTF 1
1060 float complex csqrtf (float complex z
);
1063 csqrtf (float complex z
)
1074 COMPLEX_ASSIGN (v
, 0, copysignf (sqrtf (-re
), im
));
1078 COMPLEX_ASSIGN (v
, fabsf (sqrtf (re
)), copysignf (0, im
));
1085 r
= sqrtf (0.5 * fabsf (im
));
1087 COMPLEX_ASSIGN (v
, r
, copysignf (r
, im
));
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. */
1098 r
= sqrtf (0.5 * d
+ 0.5 * re
);
1103 s
= sqrtf (0.5 * d
- 0.5 * re
);
1104 r
= fabsf ((0.5 * im
) / s
);
1107 COMPLEX_ASSIGN (v
, r
, copysignf (s
, im
));
1113 #if !defined(HAVE_CSQRT)
1114 #define HAVE_CSQRT 1
1115 double complex csqrt (double complex z
);
1118 csqrt (double complex z
)
1129 COMPLEX_ASSIGN (v
, 0, copysign (sqrt (-re
), im
));
1133 COMPLEX_ASSIGN (v
, fabs (sqrt (re
)), copysign (0, im
));
1140 r
= sqrt (0.5 * fabs (im
));
1142 COMPLEX_ASSIGN (v
, r
, copysign (r
, im
));
1149 /* Use the identity 2 Re res Im res = Im x
1150 to avoid cancellation error in d +/- Re x. */
1153 r
= sqrt (0.5 * d
+ 0.5 * re
);
1158 s
= sqrt (0.5 * d
- 0.5 * re
);
1159 r
= fabs ((0.5 * im
) / s
);
1162 COMPLEX_ASSIGN (v
, r
, copysign (s
, im
));
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
);
1173 csqrtl (long double complex z
)
1176 long double complex v
;
1184 COMPLEX_ASSIGN (v
, 0, copysignl (sqrtl (-re
), im
));
1188 COMPLEX_ASSIGN (v
, fabsl (sqrtl (re
)), copysignl (0, im
));
1195 r
= sqrtl (0.5 * fabsl (im
));
1197 COMPLEX_ASSIGN (v
, copysignl (r
, im
), r
);
1201 long double d
, r
, s
;
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. */
1208 r
= sqrtl (0.5 * d
+ 0.5 * re
);
1213 s
= sqrtl (0.5 * d
- 0.5 * re
);
1214 r
= fabsl ((0.5 * im
) / s
);
1217 COMPLEX_ASSIGN (v
, r
, copysignl (s
, im
));
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
);
1230 csinhf (float complex a
)
1237 COMPLEX_ASSIGN (v
, sinhf (r
) * cosf (i
), coshf (r
) * sinf (i
));
1242 #if !defined(HAVE_CSINH)
1243 #define HAVE_CSINH 1
1244 double complex csinh (double complex a
);
1247 csinh (double complex a
)
1254 COMPLEX_ASSIGN (v
, sinh (r
) * cos (i
), cosh (r
) * sin (i
));
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
);
1264 csinhl (long double complex a
)
1267 long double complex v
;
1271 COMPLEX_ASSIGN (v
, sinhl (r
) * cosl (i
), coshl (r
) * sinl (i
));
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
);
1283 ccoshf (float complex a
)
1290 COMPLEX_ASSIGN (v
, coshf (r
) * cosf (i
), sinhf (r
) * sinf (i
));
1295 #if !defined(HAVE_CCOSH)
1296 #define HAVE_CCOSH 1
1297 double complex ccosh (double complex a
);
1300 ccosh (double complex a
)
1307 COMPLEX_ASSIGN (v
, cosh (r
) * cos (i
), sinh (r
) * sin (i
));
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
);
1317 ccoshl (long double complex a
)
1320 long double complex v
;
1324 COMPLEX_ASSIGN (v
, coshl (r
) * cosl (i
), sinhl (r
) * sinl (i
));
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
);
1336 ctanhf (float complex a
)
1341 rt
= tanhf (REALPART (a
));
1342 it
= tanf (IMAGPART (a
));
1343 COMPLEX_ASSIGN (n
, rt
, it
);
1344 COMPLEX_ASSIGN (d
, 1, rt
* it
);
1350 #if !defined(HAVE_CTANH)
1351 #define HAVE_CTANH 1
1352 double complex ctanh (double complex a
);
1354 ctanh (double complex a
)
1357 double complex n
, d
;
1359 rt
= tanh (REALPART (a
));
1360 it
= tan (IMAGPART (a
));
1361 COMPLEX_ASSIGN (n
, rt
, it
);
1362 COMPLEX_ASSIGN (d
, 1, rt
* it
);
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
);
1373 ctanhl (long double complex a
)
1376 long double complex n
, d
;
1378 rt
= tanhl (REALPART (a
));
1379 it
= tanl (IMAGPART (a
));
1380 COMPLEX_ASSIGN (n
, rt
, it
);
1381 COMPLEX_ASSIGN (d
, 1, rt
* it
);
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
);
1394 csinf (float complex a
)
1401 COMPLEX_ASSIGN (v
, sinf (r
) * coshf (i
), cosf (r
) * sinhf (i
));
1406 #if !defined(HAVE_CSIN)
1408 double complex csin (double complex a
);
1411 csin (double complex a
)
1418 COMPLEX_ASSIGN (v
, sin (r
) * cosh (i
), cos (r
) * sinh (i
));
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
);
1428 csinl (long double complex a
)
1431 long double complex v
;
1435 COMPLEX_ASSIGN (v
, sinl (r
) * coshl (i
), cosl (r
) * sinhl (i
));
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
);
1447 ccosf (float complex a
)
1454 COMPLEX_ASSIGN (v
, cosf (r
) * coshf (i
), - (sinf (r
) * sinhf (i
)));
1459 #if !defined(HAVE_CCOS)
1461 double complex ccos (double complex a
);
1464 ccos (double complex a
)
1471 COMPLEX_ASSIGN (v
, cos (r
) * cosh (i
), - (sin (r
) * sinh (i
)));
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
);
1481 ccosl (long double complex a
)
1484 long double complex v
;
1488 COMPLEX_ASSIGN (v
, cosl (r
) * coshl (i
), - (sinl (r
) * sinhl (i
)));
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
);
1500 ctanf (float complex a
)
1505 rt
= tanf (REALPART (a
));
1506 it
= tanhf (IMAGPART (a
));
1507 COMPLEX_ASSIGN (n
, rt
, it
);
1508 COMPLEX_ASSIGN (d
, 1, - (rt
* it
));
1514 #if !defined(HAVE_CTAN)
1516 double complex ctan (double complex a
);
1519 ctan (double complex a
)
1522 double complex n
, d
;
1524 rt
= tan (REALPART (a
));
1525 it
= tanh (IMAGPART (a
));
1526 COMPLEX_ASSIGN (n
, rt
, it
);
1527 COMPLEX_ASSIGN (d
, 1, - (rt
* it
));
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
);
1538 ctanl (long double complex a
)
1541 long double complex n
, d
;
1543 rt
= tanl (REALPART (a
));
1544 it
= tanhl (IMAGPART (a
));
1545 COMPLEX_ASSIGN (n
, rt
, it
);
1546 COMPLEX_ASSIGN (d
, 1, - (rt
* it
));
1553 /* Complex ASIN. Returns wrongly NaN for infinite arguments.
1554 Algorithm taken from Abramowitz & Stegun. */
1556 #if !defined(HAVE_CASINF) && defined(HAVE_CLOGF) && defined(HAVE_CSQRTF)
1557 #define HAVE_CASINF 1
1558 complex float casinf (complex float z
);
1561 casinf (complex float z
)
1563 return -I
*clogf (I
*z
+ csqrtf (1.0f
-z
*z
));
1568 #if !defined(HAVE_CASIN) && defined(HAVE_CLOG) && defined(HAVE_CSQRT)
1569 #define HAVE_CASIN 1
1570 complex double casin (complex double z
);
1573 casin (complex double z
)
1575 return -I
*clog (I
*z
+ csqrt (1.0-z
*z
));
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
);
1585 casinl (complex long double z
)
1587 return -I
*clogl (I
*z
+ csqrtl (1.0L-z
*z
));
1592 /* Complex ACOS. Returns wrongly NaN for infinite arguments.
1593 Algorithm taken from Abramowitz & Stegun. */
1595 #if !defined(HAVE_CACOSF) && defined(HAVE_CLOGF) && defined(HAVE_CSQRTF)
1596 #define HAVE_CACOSF 1
1597 complex float cacosf (complex float z
);
1600 cacosf (complex float z
)
1602 return -I
*clogf (z
+ I
*csqrtf (1.0f
-z
*z
));
1607 #if !defined(HAVE_CACOS) && defined(HAVE_CLOG) && defined(HAVE_CSQRT)
1608 #define HAVE_CACOS 1
1609 complex double cacos (complex double z
);
1612 cacos (complex double z
)
1614 return -I
*clog (z
+ I
*csqrt (1.0-z
*z
));
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
);
1624 cacosl (complex long double z
)
1626 return -I
*clogl (z
+ I
*csqrtl (1.0L-z
*z
));
1631 /* Complex ATAN. Returns wrongly NaN for infinite arguments.
1632 Algorithm taken from Abramowitz & Stegun. */
1634 #if !defined(HAVE_CATANF) && defined(HAVE_CLOGF)
1635 #define HAVE_CACOSF 1
1636 complex float catanf (complex float z
);
1639 catanf (complex float z
)
1641 return I
*clogf ((I
+z
)/(I
-z
))/2.0f
;
1646 #if !defined(HAVE_CATAN) && defined(HAVE_CLOG)
1647 #define HAVE_CACOS 1
1648 complex double catan (complex double z
);
1651 catan (complex double z
)
1653 return I
*clog ((I
+z
)/(I
-z
))/2.0;
1658 #if !defined(HAVE_CATANL) && defined(HAVE_CLOGL)
1659 #define HAVE_CACOSL 1
1660 complex long double catanl (complex long double z
);
1663 catanl (complex long double z
)
1665 return I
*clogl ((I
+z
)/(I
-z
))/2.0L;
1670 /* Complex ASINH. Returns wrongly NaN for infinite arguments.
1671 Algorithm taken from Abramowitz & Stegun. */
1673 #if !defined(HAVE_CASINHF) && defined(HAVE_CLOGF) && defined(HAVE_CSQRTF)
1674 #define HAVE_CASINHF 1
1675 complex float casinhf (complex float z
);
1678 casinhf (complex float z
)
1680 return clogf (z
+ csqrtf (z
*z
+1.0f
));
1685 #if !defined(HAVE_CASINH) && defined(HAVE_CLOG) && defined(HAVE_CSQRT)
1686 #define HAVE_CASINH 1
1687 complex double casinh (complex double z
);
1690 casinh (complex double z
)
1692 return clog (z
+ csqrt (z
*z
+1.0));
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
);
1702 casinhl (complex long double z
)
1704 return clogl (z
+ csqrtl (z
*z
+1.0L));
1709 /* Complex ACOSH. Returns wrongly NaN for infinite arguments.
1710 Algorithm taken from Abramowitz & Stegun. */
1712 #if !defined(HAVE_CACOSHF) && defined(HAVE_CLOGF) && defined(HAVE_CSQRTF)
1713 #define HAVE_CACOSHF 1
1714 complex float cacoshf (complex float z
);
1717 cacoshf (complex float z
)
1719 return clogf (z
+ csqrtf (z
-1.0f
) * csqrtf (z
+1.0f
));
1724 #if !defined(HAVE_CACOSH) && defined(HAVE_CLOG) && defined(HAVE_CSQRT)
1725 #define HAVE_CACOSH 1
1726 complex double cacosh (complex double z
);
1729 cacosh (complex double z
)
1731 return clog (z
+ csqrt (z
-1.0) * csqrt (z
+1.0));
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
);
1741 cacoshl (complex long double z
)
1743 return clogl (z
+ csqrtl (z
-1.0L) * csqrtl (z
+1.0L));
1748 /* Complex ATANH. Returns wrongly NaN for infinite arguments.
1749 Algorithm taken from Abramowitz & Stegun. */
1751 #if !defined(HAVE_CATANHF) && defined(HAVE_CLOGF)
1752 #define HAVE_CATANHF 1
1753 complex float catanhf (complex float z
);
1756 catanhf (complex float z
)
1758 return clogf ((1.0f
+z
)/(1.0f
-z
))/2.0f
;
1763 #if !defined(HAVE_CATANH) && defined(HAVE_CLOG)
1764 #define HAVE_CATANH 1
1765 complex double catanh (complex double z
);
1768 catanh (complex double z
)
1770 return clog ((1.0+z
)/(1.0-z
))/2.0;
1774 #if !defined(HAVE_CATANHL) && defined(HAVE_CLOGL)
1775 #define HAVE_CATANHL 1
1776 complex long double catanhl (complex long double z
);
1779 catanhl (complex long double z
)
1781 return clogl ((1.0L+z
)/(1.0L-z
))/2.0L;
1786 #if !defined(HAVE_TGAMMA)
1787 #define HAVE_TGAMMA 1
1788 double tgamma (double);
1790 /* Fallback tgamma() function. Uses the algorithm from
1791 http://www.netlib.org/specfun/gamma and references therein. */
1794 #define SQRTPI 0.9189385332046727417803297
1797 #define PI 3.1415926535897932384626434
1803 double fact
, res
, sum
, xden
, xnum
, y
, y1
, ysq
, z
;
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
};
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
};
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 };
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;
1828 eps
= nextafter (1., 2.) - 1.;
1846 if (y1
!= trunc (y1
*0.5l)*2)
1848 fact
= -PI
/ sin (PI
*res
);
1852 return x
== 0 ? copysign (xinf
, x
) : xnan
;
1879 for (i
= 0; i
< 8; i
++)
1881 xnum
= (xnum
+ p
[i
]) * z
;
1882 xden
= xden
* z
+ q
[i
];
1885 res
= xnum
/ xden
+ 1;
1890 for (i
= 1; i
<= n
; i
++)
1902 for (i
= 0; i
< 6; i
++)
1903 sum
= sum
/ ysq
+ c
[i
];
1905 sum
= sum
/y
- y
+ SQRTPI
;
1906 sum
= sum
+ (y
- 0.5) * log (y
);
1910 return x
< 0 ? xnan
: xinf
;
1924 #if !defined(HAVE_LGAMMA)
1925 #define HAVE_LGAMMA 1
1926 double lgamma (double);
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)
1940 #define SQRTPI 0.9189385332046727417803297
1943 #define PI 3.1415926535897932384626434
1945 #define PNT68 0.6796875
1946 #define D1 -0.5772156649015328605195174
1947 #define D2 0.4227843350984671393993777
1948 #define D4 1.791759469228055000094023
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,
1986 static double xbig
= 2.55e305
, xinf
= __builtin_inf (), eps
= 0,
1990 double corr
, res
, xden
, xm1
, xm2
, xm4
, xnum
, ysq
;
1993 eps
= __builtin_nextafter (1., 2.) - 1.;
1995 if ((y
> 0) && (y
<= xbig
))
2009 xm1
= (y
- 0.5) - 0.5;
2012 if ((y
<= 0.5) || (y
>= PNT68
))
2016 for (i
= 0; i
< 8; i
++)
2018 xnum
= xnum
*xm1
+ p1
[i
];
2019 xden
= xden
*xm1
+ q1
[i
];
2021 res
= corr
+ (xm1
* (D1
+ xm1
*(xnum
/xden
)));
2025 xm2
= (y
- 0.5) - 0.5;
2028 for (i
= 0; i
< 8; i
++)
2030 xnum
= xnum
*xm2
+ p2
[i
];
2031 xden
= xden
*xm2
+ q2
[i
];
2033 res
= corr
+ xm2
* (D2
+ xm2
*(xnum
/xden
));
2041 for (i
= 0; i
< 8; i
++)
2043 xnum
= xnum
*xm2
+ p2
[i
];
2044 xden
= xden
*xm2
+ q2
[i
];
2046 res
= xm2
* (D2
+ xm2
*(xnum
/xden
));
2053 for (i
= 0; i
< 8; i
++)
2055 xnum
= xnum
*xm4
+ p4
[i
];
2056 xden
= xden
*xm4
+ q4
[i
];
2058 res
= D4
+ xm4
*(xnum
/xden
);
2067 for (i
= 0; i
< 6; i
++)
2068 res
= res
/ ysq
+ c
[i
];
2072 res
= res
+ SQRTPI
- 0.5*corr
;
2073 res
= res
+ y
*(corr
-1);
2076 else if (y
< 0 && __builtin_floor (y
) != y
)
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. */
2082 res
= -2 * log (fabs (y
)) - lgamma (-y
);
2084 res
= log (PI
/ fabs (y
* sin (PI
* y
))) - lgamma (-y
);
2094 #if defined(HAVE_TGAMMA) && !defined(HAVE_TGAMMAF)
2095 #define HAVE_TGAMMAF 1
2096 float tgammaf (float);
2101 return (float) tgamma ((double) x
);
2105 #if defined(HAVE_LGAMMA) && !defined(HAVE_LGAMMAF)
2106 #define HAVE_LGAMMAF 1
2107 float lgammaf (float);
2112 return (float) lgamma ((double) x
);