1 /* Implementation of various C99 functions
2 Copyright (C) 2004 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 2 of the License, or (at your option) any later version.
11 In addition to the permissions in the GNU General Public License, the
12 Free Software Foundation gives you unlimited permission to link the
13 compiled version of this file into combinations with other programs,
14 and to distribute those combinations without any restriction coming
15 from the use of this file. (The General Public License restrictions
16 do apply in other respects; for example, they cover modification of
17 the file, and distribution when not linked into a combine
20 Libgfortran is distributed in the hope that it will be useful,
21 but WITHOUT ANY WARRANTY; without even the implied warranty of
22 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
23 GNU General Public License for more details.
25 You should have received a copy of the GNU General Public
26 License along with libgfortran; see the file COPYING. If not,
27 write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
28 Boston, MA 02110-1301, USA. */
31 #include <sys/types.h>
35 #define C99_PROTOS_H WE_DONT_WANT_PROTOS_NOW
36 #include "libgfortran.h"
38 /* IRIX's <math.h> declares a non-C99 compliant implementation of cabs,
39 which takes two floating point arguments instead of a single complex.
40 If <complex.h> is missing this prevents building of c99_functions.c.
41 To work around this we redirect cabs{,f,l} calls to __gfc_cabs{,f,l}. */
43 #if defined(__sgi__) && !defined(HAVE_COMPLEX_H)
47 #define cabs __gfc_cabs
48 #define cabsf __gfc_cabsf
49 #define cabsl __gfc_cabsl
52 /* Tru64's <math.h> declares a non-C99 compliant implementation of cabs,
53 which takes two floating point arguments instead of a single complex.
54 To work around this we redirect cabs{,f,l} calls to __gfc_cabs{,f,l}. */
60 #define cabs __gfc_cabs
61 #define cabsf __gfc_cabsf
62 #define cabsl __gfc_cabsl
65 /* Prototypes to silence -Wstrict-prototypes -Wmissing-prototypes. */
67 float cabsf(float complex);
68 double cabs(double complex);
69 long double cabsl(long double complex);
71 float cargf(float complex);
72 double carg(double complex);
73 long double cargl(long double complex);
75 float complex clog10f(float complex);
76 double complex clog10(double complex);
77 long double complex clog10l(long double complex);
80 /* Wrappers for systems without the various C99 single precision Bessel
83 #if defined(HAVE_J0) && ! defined(HAVE_J0F)
85 extern float j0f (float);
90 return (float) j0 ((double) x);
94 #if defined(HAVE_J1) && !defined(HAVE_J1F)
96 extern float j1f (float);
100 return (float) j1 ((double) x);
104 #if defined(HAVE_JN) && !defined(HAVE_JNF)
106 extern float jnf (int, float);
111 return (float) jn (n, (double) x);
115 #if defined(HAVE_Y0) && !defined(HAVE_Y0F)
117 extern float y0f (float);
122 return (float) y0 ((double) x);
126 #if defined(HAVE_Y1) && !defined(HAVE_Y1F)
128 extern float y1f (float);
133 return (float) y1 ((double) x);
137 #if defined(HAVE_YN) && !defined(HAVE_YNF)
139 extern float ynf (int, float);
144 return (float) yn (n, (double) x);
149 /* Wrappers for systems without the C99 erff() and erfcf() functions. */
151 #if defined(HAVE_ERF) && !defined(HAVE_ERFF)
153 extern float erff (float);
158 return (float) erf ((double) x);
162 #if defined(HAVE_ERFC) && !defined(HAVE_ERFCF)
164 extern float erfcf (float);
169 return (float) erfc ((double) x);
179 return (float) acos(x);
183 #if HAVE_ACOSH && !HAVE_ACOSHF
187 return (float) acosh ((double) x);
196 return (float) asin(x);
200 #if HAVE_ASINH && !HAVE_ASINHF
204 return (float) asinh ((double) x);
209 #define HAVE_ATAN2F 1
211 atan2f(float y, float x)
213 return (float) atan2(y, x);
222 return (float) atan(x);
226 #if HAVE_ATANH && !HAVE_ATANHF
230 return (float) atanh ((double) x);
239 return (float) ceil(x);
243 #ifndef HAVE_COPYSIGNF
244 #define HAVE_COPYSIGNF 1
246 copysignf(float x, float y)
248 return (float) copysign(x, y);
257 return (float) cos(x);
266 return (float) cosh(x);
275 return (float) exp(x);
284 return (float) fabs(x);
289 #define HAVE_FLOORF 1
293 return (float) floor(x);
298 #define HAVE_FREXPF 1
300 frexpf(float x, int *exp)
302 return (float) frexp(x, exp);
307 #define HAVE_HYPOTF 1
309 hypotf(float x, float y)
311 return (float) hypot(x, y);
320 return (float) log(x);
325 #define HAVE_LOG10F 1
329 return (float) log10(x);
334 #define HAVE_SCALBN 1
336 scalbn(double x, int y)
338 return x * pow(FLT_RADIX, y);
343 #define HAVE_SCALBNF 1
345 scalbnf(float x, int y)
347 return (float) scalbn(x, y);
356 return (float) sin(x);
365 return (float) sinh(x);
374 return (float) sqrt(x);
383 return (float) tan(x);
392 return (float) tanh(x);
412 #define HAVE_TRUNCF 1
416 return (float) trunc (x);
420 #ifndef HAVE_NEXTAFTERF
421 #define HAVE_NEXTAFTERF 1
422 /* This is a portable implementation of nextafterf that is intended to be
423 independent of the floating point format or its in memory representation.
424 This implementation works correctly with denormalized values. */
426 nextafterf(float x, float y)
428 /* This variable is marked volatile to avoid excess precision problems
429 on some platforms, including IA-32. */
430 volatile float delta;
431 float absx, denorm_min;
433 if (isnan(x) || isnan(y))
438 return x > 0 ? __FLT_MAX__ : - __FLT_MAX__;
440 /* absx = fabsf (x); */
441 absx = (x < 0.0) ? -x : x;
443 /* __FLT_DENORM_MIN__ is non-zero iff the target supports denormals. */
444 if (__FLT_DENORM_MIN__ == 0.0f)
445 denorm_min = __FLT_MIN__;
447 denorm_min = __FLT_DENORM_MIN__;
449 if (absx < __FLT_MIN__)
456 /* Discard the fraction from x. */
457 frac = frexpf (absx, &exp);
458 delta = scalbnf (0.5f, exp);
460 /* Scale x by the epsilon of the representation. By rights we should
461 have been able to combine this with scalbnf, but some targets don't
462 get that correct with denormals. */
463 delta *= __FLT_EPSILON__;
465 /* If we're going to be reducing the absolute value of X, and doing so
466 would reduce the exponent of X, then the delta to be applied is
467 one exponent smaller. */
468 if (frac == 0.5f && (y < x) == (x > 0))
471 /* If that underflows to zero, then we're back to the minimum. */
487 powf(float x, float y)
489 return (float) pow(x, y);
493 /* Note that if fpclassify is not defined, then NaN is not handled */
495 /* Algorithm by Steven G. Kargl. */
499 /* Round to nearest integral value. If the argument is halfway between two
500 integral values then round away from zero. */
527 #define HAVE_ROUNDF 1
528 /* Round to nearest integral value. If the argument is halfway between two
529 integral values then round away from zero. */
556 #define HAVE_LOG10L 1
557 /* log10 function for long double variables. The version provided here
558 reduces the argument until it fits into a double, then use log10. */
560 log10l(long double x)
562 #if LDBL_MAX_EXP > DBL_MAX_EXP
567 if (x > 0x1p16383L) { p2_result += 16383; x /= 0x1p16383L; }
568 if (x > 0x1p8191L) { p2_result += 8191; x /= 0x1p8191L; }
569 if (x > 0x1p4095L) { p2_result += 4095; x /= 0x1p4095L; }
570 if (x > 0x1p2047L) { p2_result += 2047; x /= 0x1p2047L; }
571 if (x > 0x1p1023L) { p2_result += 1023; x /= 0x1p1023L; }
572 val = log10 ((double) x);
573 return (val + p2_result * .30102999566398119521373889472449302L);
576 #if LDBL_MIN_EXP < DBL_MIN_EXP
581 if (x < 0x1p-16380L) { p2_result += 16380; x /= 0x1p-16380L; }
582 if (x < 0x1p-8189L) { p2_result += 8189; x /= 0x1p-8189L; }
583 if (x < 0x1p-4093L) { p2_result += 4093; x /= 0x1p-4093L; }
584 if (x < 0x1p-2045L) { p2_result += 2045; x /= 0x1p-2045L; }
585 if (x < 0x1p-1021L) { p2_result += 1021; x /= 0x1p-1021L; }
586 val = fabs(log10 ((double) x));
587 return (- val - p2_result * .30102999566398119521373889472449302L);
595 #if !defined(HAVE_CABSF)
598 cabsf (float complex z)
600 return hypotf (REALPART (z), IMAGPART (z));
604 #if !defined(HAVE_CABS)
607 cabs (double complex z)
609 return hypot (REALPART (z), IMAGPART (z));
613 #if !defined(HAVE_CABSL) && defined(HAVE_HYPOTL)
616 cabsl (long double complex z)
618 return hypotl (REALPART (z), IMAGPART (z));
623 #if !defined(HAVE_CARGF)
626 cargf (float complex z)
628 return atan2f (IMAGPART (z), REALPART (z));
632 #if !defined(HAVE_CARG)
635 carg (double complex z)
637 return atan2 (IMAGPART (z), REALPART (z));
641 #if !defined(HAVE_CARGL) && defined(HAVE_ATAN2L)
644 cargl (long double complex z)
646 return atan2l (IMAGPART (z), REALPART (z));
651 /* exp(z) = exp(a)*(cos(b) + i sin(b)) */
652 #if !defined(HAVE_CEXPF)
655 cexpf (float complex z)
662 COMPLEX_ASSIGN (v, cosf (b), sinf (b));
667 #if !defined(HAVE_CEXP)
670 cexp (double complex z)
677 COMPLEX_ASSIGN (v, cos (b), sin (b));
682 #if !defined(HAVE_CEXPL) && defined(HAVE_COSL) && defined(HAVE_SINL) && defined(EXPL)
685 cexpl (long double complex z)
688 long double complex v;
692 COMPLEX_ASSIGN (v, cosl (b), sinl (b));
698 /* log(z) = log (cabs(z)) + i*carg(z) */
699 #if !defined(HAVE_CLOGF)
702 clogf (float complex z)
706 COMPLEX_ASSIGN (v, logf (cabsf (z)), cargf (z));
711 #if !defined(HAVE_CLOG)
714 clog (double complex z)
718 COMPLEX_ASSIGN (v, log (cabs (z)), carg (z));
723 #if !defined(HAVE_CLOGL) && defined(HAVE_LOGL) && defined(HAVE_CABSL) && defined(HAVE_CARGL)
726 clogl (long double complex z)
728 long double complex v;
730 COMPLEX_ASSIGN (v, logl (cabsl (z)), cargl (z));
736 /* log10(z) = log10 (cabs(z)) + i*carg(z) */
737 #if !defined(HAVE_CLOG10F)
738 #define HAVE_CLOG10F 1
740 clog10f (float complex z)
744 COMPLEX_ASSIGN (v, log10f (cabsf (z)), cargf (z));
749 #if !defined(HAVE_CLOG10)
750 #define HAVE_CLOG10 1
752 clog10 (double complex z)
756 COMPLEX_ASSIGN (v, log10 (cabs (z)), carg (z));
761 #if !defined(HAVE_CLOG10L) && defined(HAVE_LOG10L) && defined(HAVE_CABSL) && defined(HAVE_CARGL)
762 #define HAVE_CLOG10L 1
764 clog10l (long double complex z)
766 long double complex v;
768 COMPLEX_ASSIGN (v, log10l (cabsl (z)), cargl (z));
774 /* pow(base, power) = cexp (power * clog (base)) */
775 #if !defined(HAVE_CPOWF)
778 cpowf (float complex base, float complex power)
780 return cexpf (power * clogf (base));
784 #if !defined(HAVE_CPOW)
787 cpow (double complex base, double complex power)
789 return cexp (power * clog (base));
793 #if !defined(HAVE_CPOWL) && defined(HAVE_CEXPL) && defined(HAVE_CLOGL)
796 cpowl (long double complex base, long double complex power)
798 return cexpl (power * clogl (base));
803 /* sqrt(z). Algorithm pulled from glibc. */
804 #if !defined(HAVE_CSQRTF)
805 #define HAVE_CSQRTF 1
807 csqrtf (float complex z)
818 COMPLEX_ASSIGN (v, 0, copysignf (sqrtf (-re), im));
822 COMPLEX_ASSIGN (v, fabsf (sqrtf (re)), copysignf (0, im));
829 r = sqrtf (0.5 * fabsf (im));
831 COMPLEX_ASSIGN (v, r, copysignf (r, im));
838 /* Use the identity 2 Re res Im res = Im x
839 to avoid cancellation error in d +/- Re x. */
842 r = sqrtf (0.5 * d + 0.5 * re);
847 s = sqrtf (0.5 * d - 0.5 * re);
848 r = fabsf ((0.5 * im) / s);
851 COMPLEX_ASSIGN (v, r, copysignf (s, im));
857 #if !defined(HAVE_CSQRT)
860 csqrt (double complex z)
871 COMPLEX_ASSIGN (v, 0, copysign (sqrt (-re), im));
875 COMPLEX_ASSIGN (v, fabs (sqrt (re)), copysign (0, im));
882 r = sqrt (0.5 * fabs (im));
884 COMPLEX_ASSIGN (v, r, copysign (r, im));
891 /* Use the identity 2 Re res Im res = Im x
892 to avoid cancellation error in d +/- Re x. */
895 r = sqrt (0.5 * d + 0.5 * re);
900 s = sqrt (0.5 * d - 0.5 * re);
901 r = fabs ((0.5 * im) / s);
904 COMPLEX_ASSIGN (v, r, copysign (s, im));
910 #if !defined(HAVE_CSQRTL) && defined(HAVE_COPYSIGNL) && defined(HAVE_SQRTL) && defined(HAVE_FABSL) && defined(HAVE_HYPOTL)
911 #define HAVE_CSQRTL 1
913 csqrtl (long double complex z)
916 long double complex v;
924 COMPLEX_ASSIGN (v, 0, copysignl (sqrtl (-re), im));
928 COMPLEX_ASSIGN (v, fabsl (sqrtl (re)), copysignl (0, im));
935 r = sqrtl (0.5 * fabsl (im));
937 COMPLEX_ASSIGN (v, copysignl (r, im), r);
944 /* Use the identity 2 Re res Im res = Im x
945 to avoid cancellation error in d +/- Re x. */
948 r = sqrtl (0.5 * d + 0.5 * re);
953 s = sqrtl (0.5 * d - 0.5 * re);
954 r = fabsl ((0.5 * im) / s);
957 COMPLEX_ASSIGN (v, r, copysignl (s, im));
964 /* sinh(a + i b) = sinh(a) cos(b) + i cosh(a) sin(b) */
965 #if !defined(HAVE_CSINHF)
966 #define HAVE_CSINHF 1
968 csinhf (float complex a)
975 COMPLEX_ASSIGN (v, sinhf (r) * cosf (i), coshf (r) * sinf (i));
980 #if !defined(HAVE_CSINH)
983 csinh (double complex a)
990 COMPLEX_ASSIGN (v, sinh (r) * cos (i), cosh (r) * sin (i));
995 #if !defined(HAVE_CSINHL) && defined(HAVE_COSL) && defined(HAVE_COSHL) && defined(HAVE_SINL) && defined(HAVE_SINHL)
996 #define HAVE_CSINHL 1
998 csinhl (long double complex a)
1001 long double complex v;
1005 COMPLEX_ASSIGN (v, sinhl (r) * cosl (i), coshl (r) * sinl (i));
1011 /* cosh(a + i b) = cosh(a) cos(b) - i sinh(a) sin(b) */
1012 #if !defined(HAVE_CCOSHF)
1013 #define HAVE_CCOSHF 1
1015 ccoshf (float complex a)
1022 COMPLEX_ASSIGN (v, coshf (r) * cosf (i), - (sinhf (r) * sinf (i)));
1027 #if !defined(HAVE_CCOSH)
1028 #define HAVE_CCOSH 1
1030 ccosh (double complex a)
1037 COMPLEX_ASSIGN (v, cosh (r) * cos (i), - (sinh (r) * sin (i)));
1042 #if !defined(HAVE_CCOSHL) && defined(HAVE_COSL) && defined(HAVE_COSHL) && defined(HAVE_SINL) && defined(HAVE_SINHL)
1043 #define HAVE_CCOSHL 1
1045 ccoshl (long double complex a)
1048 long double complex v;
1052 COMPLEX_ASSIGN (v, coshl (r) * cosl (i), - (sinhl (r) * sinl (i)));
1058 /* tanh(a + i b) = (tanh(a) + i tan(b)) / (1 - i tanh(a) tan(b)) */
1059 #if !defined(HAVE_CTANHF)
1060 #define HAVE_CTANHF 1
1062 ctanhf (float complex a)
1067 rt = tanhf (REALPART (a));
1068 it = tanf (IMAGPART (a));
1069 COMPLEX_ASSIGN (n, rt, it);
1070 COMPLEX_ASSIGN (d, 1, - (rt * it));
1076 #if !defined(HAVE_CTANH)
1077 #define HAVE_CTANH 1
1079 ctanh (double complex a)
1082 double complex n, d;
1084 rt = tanh (REALPART (a));
1085 it = tan (IMAGPART (a));
1086 COMPLEX_ASSIGN (n, rt, it);
1087 COMPLEX_ASSIGN (d, 1, - (rt * it));
1093 #if !defined(HAVE_CTANHL) && defined(HAVE_TANL) && defined(HAVE_TANHL)
1094 #define HAVE_CTANHL 1
1096 ctanhl (long double complex a)
1099 long double complex n, d;
1101 rt = tanhl (REALPART (a));
1102 it = tanl (IMAGPART (a));
1103 COMPLEX_ASSIGN (n, rt, it);
1104 COMPLEX_ASSIGN (d, 1, - (rt * it));
1111 /* sin(a + i b) = sin(a) cosh(b) + i cos(a) sinh(b) */
1112 #if !defined(HAVE_CSINF)
1113 #define HAVE_CSINF 1
1115 csinf (float complex a)
1122 COMPLEX_ASSIGN (v, sinf (r) * coshf (i), cosf (r) * sinhf (i));
1127 #if !defined(HAVE_CSIN)
1130 csin (double complex a)
1137 COMPLEX_ASSIGN (v, sin (r) * cosh (i), cos (r) * sinh (i));
1142 #if !defined(HAVE_CSINL) && defined(HAVE_COSL) && defined(HAVE_COSHL) && defined(HAVE_SINL) && defined(HAVE_SINHL)
1143 #define HAVE_CSINL 1
1145 csinl (long double complex a)
1148 long double complex v;
1152 COMPLEX_ASSIGN (v, sinl (r) * coshl (i), cosl (r) * sinhl (i));
1158 /* cos(a + i b) = cos(a) cosh(b) - i sin(a) sinh(b) */
1159 #if !defined(HAVE_CCOSF)
1160 #define HAVE_CCOSF 1
1162 ccosf (float complex a)
1169 COMPLEX_ASSIGN (v, cosf (r) * coshf (i), - (sinf (r) * sinhf (i)));
1174 #if !defined(HAVE_CCOS)
1177 ccos (double complex a)
1184 COMPLEX_ASSIGN (v, cos (r) * cosh (i), - (sin (r) * sinh (i)));
1189 #if !defined(HAVE_CCOSL) && defined(HAVE_COSL) && defined(HAVE_COSHL) && defined(HAVE_SINL) && defined(HAVE_SINHL)
1190 #define HAVE_CCOSL 1
1192 ccosl (long double complex a)
1195 long double complex v;
1199 COMPLEX_ASSIGN (v, cosl (r) * coshl (i), - (sinl (r) * sinhl (i)));
1205 /* tan(a + i b) = (tan(a) + i tanh(b)) / (1 - i tan(a) tanh(b)) */
1206 #if !defined(HAVE_CTANF)
1207 #define HAVE_CTANF 1
1209 ctanf (float complex a)
1214 rt = tanf (REALPART (a));
1215 it = tanhf (IMAGPART (a));
1216 COMPLEX_ASSIGN (n, rt, it);
1217 COMPLEX_ASSIGN (d, 1, - (rt * it));
1223 #if !defined(HAVE_CTAN)
1226 ctan (double complex a)
1229 double complex n, d;
1231 rt = tan (REALPART (a));
1232 it = tanh (IMAGPART (a));
1233 COMPLEX_ASSIGN (n, rt, it);
1234 COMPLEX_ASSIGN (d, 1, - (rt * it));
1240 #if !defined(HAVE_CTANL) && defined(HAVE_TANL) && defined(HAVE_TANHL)
1241 #define HAVE_CTANL 1
1243 ctanl (long double complex a)
1246 long double complex n, d;
1248 rt = tanl (REALPART (a));
1249 it = tanhl (IMAGPART (a));
1250 COMPLEX_ASSIGN (n, rt, it);
1251 COMPLEX_ASSIGN (d, 1, - (rt * it));