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. */
32 #define C99_PROTOS_H WE_DONT_WANT_PROTOS_NOW
33 #include "libgfortran.h"
35 /* IRIX's <math.h> declares a non-C99 compliant implementation of cabs,
36 which takes two floating point arguments instead of a single complex.
37 If <complex.h> is missing this prevents building of c99_functions.c.
38 To work around this we redirect cabs{,f,l} calls to __gfc_cabs{,f,l}. */
40 #if defined(__sgi__) && !defined(HAVE_COMPLEX_H)
44 #define cabs __gfc_cabs
45 #define cabsf __gfc_cabsf
46 #define cabsl __gfc_cabsl
49 /* Tru64's <math.h> declares a non-C99 compliant implementation of cabs,
50 which takes two floating point arguments instead of a single complex.
51 To work around this we redirect cabs{,f,l} calls to __gfc_cabs{,f,l}. */
57 #define cabs __gfc_cabs
58 #define cabsf __gfc_cabsf
59 #define cabsl __gfc_cabsl
62 /* Prototypes to silence -Wstrict-prototypes -Wmissing-prototypes. */
64 float cabsf(float complex);
65 double cabs(double complex);
66 long double cabsl(long double complex);
68 float cargf(float complex);
69 double carg(double complex);
70 long double cargl(long double complex);
72 float complex clog10f(float complex);
73 double complex clog10(double complex);
74 long double complex clog10l(long double complex);
77 /* Wrappers for systems without the various C99 single precision Bessel
80 #if defined(HAVE_J0) && ! defined(HAVE_J0F)
82 extern float j0f (float);
87 return (float) j0 ((double) x);
91 #if defined(HAVE_J1) && !defined(HAVE_J1F)
93 extern float j1f (float);
97 return (float) j1 ((double) x);
101 #if defined(HAVE_JN) && !defined(HAVE_JNF)
103 extern float jnf (int, float);
108 return (float) jn (n, (double) x);
112 #if defined(HAVE_Y0) && !defined(HAVE_Y0F)
114 extern float y0f (float);
119 return (float) y0 ((double) x);
123 #if defined(HAVE_Y1) && !defined(HAVE_Y1F)
125 extern float y1f (float);
130 return (float) y1 ((double) x);
134 #if defined(HAVE_YN) && !defined(HAVE_YNF)
136 extern float ynf (int, float);
141 return (float) yn (n, (double) x);
146 /* Wrappers for systems without the C99 erff() and erfcf() functions. */
148 #if defined(HAVE_ERF) && !defined(HAVE_ERFF)
150 extern float erff (float);
155 return (float) erf ((double) x);
159 #if defined(HAVE_ERFC) && !defined(HAVE_ERFCF)
161 extern float erfcf (float);
166 return (float) erfc ((double) x);
176 return (float) acos(x);
180 #if HAVE_ACOSH && !HAVE_ACOSHF
184 return (float) acosh ((double) x);
193 return (float) asin(x);
197 #if HAVE_ASINH && !HAVE_ASINHF
201 return (float) asinh ((double) x);
206 #define HAVE_ATAN2F 1
208 atan2f(float y, float x)
210 return (float) atan2(y, x);
219 return (float) atan(x);
223 #if HAVE_ATANH && !HAVE_ATANHF
227 return (float) atanh ((double) x);
236 return (float) ceil(x);
240 #ifndef HAVE_COPYSIGNF
241 #define HAVE_COPYSIGNF 1
243 copysignf(float x, float y)
245 return (float) copysign(x, y);
254 return (float) cos(x);
263 return (float) cosh(x);
272 return (float) exp(x);
281 return (float) fabs(x);
286 #define HAVE_FLOORF 1
290 return (float) floor(x);
297 fmodf (float x, float y)
299 return (float) fmod (x, y);
304 #define HAVE_FREXPF 1
306 frexpf(float x, int *exp)
308 return (float) frexp(x, exp);
313 #define HAVE_HYPOTF 1
315 hypotf(float x, float y)
317 return (float) hypot(x, y);
326 return (float) log(x);
331 #define HAVE_LOG10F 1
335 return (float) log10(x);
340 #define HAVE_SCALBN 1
342 scalbn(double x, int y)
344 return x * pow(FLT_RADIX, y);
349 #define HAVE_SCALBNF 1
351 scalbnf(float x, int y)
353 return (float) scalbn(x, y);
362 return (float) sin(x);
371 return (float) sinh(x);
380 return (float) sqrt(x);
389 return (float) tan(x);
398 return (float) tanh(x);
418 #define HAVE_TRUNCF 1
422 return (float) trunc (x);
426 #ifndef HAVE_NEXTAFTERF
427 #define HAVE_NEXTAFTERF 1
428 /* This is a portable implementation of nextafterf that is intended to be
429 independent of the floating point format or its in memory representation.
430 This implementation works correctly with denormalized values. */
432 nextafterf(float x, float y)
434 /* This variable is marked volatile to avoid excess precision problems
435 on some platforms, including IA-32. */
436 volatile float delta;
437 float absx, denorm_min;
439 if (isnan(x) || isnan(y))
444 return x > 0 ? __FLT_MAX__ : - __FLT_MAX__;
446 /* absx = fabsf (x); */
447 absx = (x < 0.0) ? -x : x;
449 /* __FLT_DENORM_MIN__ is non-zero iff the target supports denormals. */
450 if (__FLT_DENORM_MIN__ == 0.0f)
451 denorm_min = __FLT_MIN__;
453 denorm_min = __FLT_DENORM_MIN__;
455 if (absx < __FLT_MIN__)
462 /* Discard the fraction from x. */
463 frac = frexpf (absx, &exp);
464 delta = scalbnf (0.5f, exp);
466 /* Scale x by the epsilon of the representation. By rights we should
467 have been able to combine this with scalbnf, but some targets don't
468 get that correct with denormals. */
469 delta *= __FLT_EPSILON__;
471 /* If we're going to be reducing the absolute value of X, and doing so
472 would reduce the exponent of X, then the delta to be applied is
473 one exponent smaller. */
474 if (frac == 0.5f && (y < x) == (x > 0))
477 /* If that underflows to zero, then we're back to the minimum. */
493 powf(float x, float y)
495 return (float) pow(x, y);
499 /* Note that if fpclassify is not defined, then NaN is not handled */
501 /* Algorithm by Steven G. Kargl. */
505 /* Round to nearest integral value. If the argument is halfway between two
506 integral values then round away from zero. */
533 #define HAVE_ROUNDF 1
534 /* Round to nearest integral value. If the argument is halfway between two
535 integral values then round away from zero. */
562 #define HAVE_LOG10L 1
563 /* log10 function for long double variables. The version provided here
564 reduces the argument until it fits into a double, then use log10. */
566 log10l(long double x)
568 #if LDBL_MAX_EXP > DBL_MAX_EXP
573 if (x > 0x1p16383L) { p2_result += 16383; x /= 0x1p16383L; }
574 if (x > 0x1p8191L) { p2_result += 8191; x /= 0x1p8191L; }
575 if (x > 0x1p4095L) { p2_result += 4095; x /= 0x1p4095L; }
576 if (x > 0x1p2047L) { p2_result += 2047; x /= 0x1p2047L; }
577 if (x > 0x1p1023L) { p2_result += 1023; x /= 0x1p1023L; }
578 val = log10 ((double) x);
579 return (val + p2_result * .30102999566398119521373889472449302L);
582 #if LDBL_MIN_EXP < DBL_MIN_EXP
587 if (x < 0x1p-16380L) { p2_result += 16380; x /= 0x1p-16380L; }
588 if (x < 0x1p-8189L) { p2_result += 8189; x /= 0x1p-8189L; }
589 if (x < 0x1p-4093L) { p2_result += 4093; x /= 0x1p-4093L; }
590 if (x < 0x1p-2045L) { p2_result += 2045; x /= 0x1p-2045L; }
591 if (x < 0x1p-1021L) { p2_result += 1021; x /= 0x1p-1021L; }
592 val = fabs(log10 ((double) x));
593 return (- val - p2_result * .30102999566398119521373889472449302L);
602 #define HAVE_FLOORL 1
604 floorl (long double x)
606 /* Zero, possibly signed. */
610 /* Large magnitude. */
611 if (x > DBL_MAX || x < (-DBL_MAX))
614 /* Small positive values. */
615 if (x >= 0 && x < DBL_MIN)
618 /* Small negative values. */
619 if (x < 0 && x > (-DBL_MIN))
630 fmodl (long double x, long double y)
635 /* Need to check that the result has the same sign as x and magnitude
636 less than the magnitude of y. */
637 return x - floorl (x / y) * y;
642 #if !defined(HAVE_CABSF)
645 cabsf (float complex z)
647 return hypotf (REALPART (z), IMAGPART (z));
651 #if !defined(HAVE_CABS)
654 cabs (double complex z)
656 return hypot (REALPART (z), IMAGPART (z));
660 #if !defined(HAVE_CABSL) && defined(HAVE_HYPOTL)
663 cabsl (long double complex z)
665 return hypotl (REALPART (z), IMAGPART (z));
670 #if !defined(HAVE_CARGF)
673 cargf (float complex z)
675 return atan2f (IMAGPART (z), REALPART (z));
679 #if !defined(HAVE_CARG)
682 carg (double complex z)
684 return atan2 (IMAGPART (z), REALPART (z));
688 #if !defined(HAVE_CARGL) && defined(HAVE_ATAN2L)
691 cargl (long double complex z)
693 return atan2l (IMAGPART (z), REALPART (z));
698 /* exp(z) = exp(a)*(cos(b) + i sin(b)) */
699 #if !defined(HAVE_CEXPF)
702 cexpf (float complex z)
709 COMPLEX_ASSIGN (v, cosf (b), sinf (b));
714 #if !defined(HAVE_CEXP)
717 cexp (double complex z)
724 COMPLEX_ASSIGN (v, cos (b), sin (b));
729 #if !defined(HAVE_CEXPL) && defined(HAVE_COSL) && defined(HAVE_SINL) && defined(EXPL)
732 cexpl (long double complex z)
735 long double complex v;
739 COMPLEX_ASSIGN (v, cosl (b), sinl (b));
745 /* log(z) = log (cabs(z)) + i*carg(z) */
746 #if !defined(HAVE_CLOGF)
749 clogf (float complex z)
753 COMPLEX_ASSIGN (v, logf (cabsf (z)), cargf (z));
758 #if !defined(HAVE_CLOG)
761 clog (double complex z)
765 COMPLEX_ASSIGN (v, log (cabs (z)), carg (z));
770 #if !defined(HAVE_CLOGL) && defined(HAVE_LOGL) && defined(HAVE_CABSL) && defined(HAVE_CARGL)
773 clogl (long double complex z)
775 long double complex v;
777 COMPLEX_ASSIGN (v, logl (cabsl (z)), cargl (z));
783 /* log10(z) = log10 (cabs(z)) + i*carg(z) */
784 #if !defined(HAVE_CLOG10F)
785 #define HAVE_CLOG10F 1
787 clog10f (float complex z)
791 COMPLEX_ASSIGN (v, log10f (cabsf (z)), cargf (z));
796 #if !defined(HAVE_CLOG10)
797 #define HAVE_CLOG10 1
799 clog10 (double complex z)
803 COMPLEX_ASSIGN (v, log10 (cabs (z)), carg (z));
808 #if !defined(HAVE_CLOG10L) && defined(HAVE_LOG10L) && defined(HAVE_CABSL) && defined(HAVE_CARGL)
809 #define HAVE_CLOG10L 1
811 clog10l (long double complex z)
813 long double complex v;
815 COMPLEX_ASSIGN (v, log10l (cabsl (z)), cargl (z));
821 /* pow(base, power) = cexp (power * clog (base)) */
822 #if !defined(HAVE_CPOWF)
825 cpowf (float complex base, float complex power)
827 return cexpf (power * clogf (base));
831 #if !defined(HAVE_CPOW)
834 cpow (double complex base, double complex power)
836 return cexp (power * clog (base));
840 #if !defined(HAVE_CPOWL) && defined(HAVE_CEXPL) && defined(HAVE_CLOGL)
843 cpowl (long double complex base, long double complex power)
845 return cexpl (power * clogl (base));
850 /* sqrt(z). Algorithm pulled from glibc. */
851 #if !defined(HAVE_CSQRTF)
852 #define HAVE_CSQRTF 1
854 csqrtf (float complex z)
865 COMPLEX_ASSIGN (v, 0, copysignf (sqrtf (-re), im));
869 COMPLEX_ASSIGN (v, fabsf (sqrtf (re)), copysignf (0, im));
876 r = sqrtf (0.5 * fabsf (im));
878 COMPLEX_ASSIGN (v, r, copysignf (r, im));
885 /* Use the identity 2 Re res Im res = Im x
886 to avoid cancellation error in d +/- Re x. */
889 r = sqrtf (0.5 * d + 0.5 * re);
894 s = sqrtf (0.5 * d - 0.5 * re);
895 r = fabsf ((0.5 * im) / s);
898 COMPLEX_ASSIGN (v, r, copysignf (s, im));
904 #if !defined(HAVE_CSQRT)
907 csqrt (double complex z)
918 COMPLEX_ASSIGN (v, 0, copysign (sqrt (-re), im));
922 COMPLEX_ASSIGN (v, fabs (sqrt (re)), copysign (0, im));
929 r = sqrt (0.5 * fabs (im));
931 COMPLEX_ASSIGN (v, r, copysign (r, im));
938 /* Use the identity 2 Re res Im res = Im x
939 to avoid cancellation error in d +/- Re x. */
942 r = sqrt (0.5 * d + 0.5 * re);
947 s = sqrt (0.5 * d - 0.5 * re);
948 r = fabs ((0.5 * im) / s);
951 COMPLEX_ASSIGN (v, r, copysign (s, im));
957 #if !defined(HAVE_CSQRTL) && defined(HAVE_COPYSIGNL) && defined(HAVE_SQRTL) && defined(HAVE_FABSL) && defined(HAVE_HYPOTL)
958 #define HAVE_CSQRTL 1
960 csqrtl (long double complex z)
963 long double complex v;
971 COMPLEX_ASSIGN (v, 0, copysignl (sqrtl (-re), im));
975 COMPLEX_ASSIGN (v, fabsl (sqrtl (re)), copysignl (0, im));
982 r = sqrtl (0.5 * fabsl (im));
984 COMPLEX_ASSIGN (v, copysignl (r, im), r);
991 /* Use the identity 2 Re res Im res = Im x
992 to avoid cancellation error in d +/- Re x. */
995 r = sqrtl (0.5 * d + 0.5 * re);
1000 s = sqrtl (0.5 * d - 0.5 * re);
1001 r = fabsl ((0.5 * im) / s);
1004 COMPLEX_ASSIGN (v, r, copysignl (s, im));
1011 /* sinh(a + i b) = sinh(a) cos(b) + i cosh(a) sin(b) */
1012 #if !defined(HAVE_CSINHF)
1013 #define HAVE_CSINHF 1
1015 csinhf (float complex a)
1022 COMPLEX_ASSIGN (v, sinhf (r) * cosf (i), coshf (r) * sinf (i));
1027 #if !defined(HAVE_CSINH)
1028 #define HAVE_CSINH 1
1030 csinh (double complex a)
1037 COMPLEX_ASSIGN (v, sinh (r) * cos (i), cosh (r) * sin (i));
1042 #if !defined(HAVE_CSINHL) && defined(HAVE_COSL) && defined(HAVE_COSHL) && defined(HAVE_SINL) && defined(HAVE_SINHL)
1043 #define HAVE_CSINHL 1
1045 csinhl (long double complex a)
1048 long double complex v;
1052 COMPLEX_ASSIGN (v, sinhl (r) * cosl (i), coshl (r) * sinl (i));
1058 /* cosh(a + i b) = cosh(a) cos(b) - i sinh(a) sin(b) */
1059 #if !defined(HAVE_CCOSHF)
1060 #define HAVE_CCOSHF 1
1062 ccoshf (float complex a)
1069 COMPLEX_ASSIGN (v, coshf (r) * cosf (i), - (sinhf (r) * sinf (i)));
1074 #if !defined(HAVE_CCOSH)
1075 #define HAVE_CCOSH 1
1077 ccosh (double complex a)
1084 COMPLEX_ASSIGN (v, cosh (r) * cos (i), - (sinh (r) * sin (i)));
1089 #if !defined(HAVE_CCOSHL) && defined(HAVE_COSL) && defined(HAVE_COSHL) && defined(HAVE_SINL) && defined(HAVE_SINHL)
1090 #define HAVE_CCOSHL 1
1092 ccoshl (long double complex a)
1095 long double complex v;
1099 COMPLEX_ASSIGN (v, coshl (r) * cosl (i), - (sinhl (r) * sinl (i)));
1105 /* tanh(a + i b) = (tanh(a) + i tan(b)) / (1 - i tanh(a) tan(b)) */
1106 #if !defined(HAVE_CTANHF)
1107 #define HAVE_CTANHF 1
1109 ctanhf (float complex a)
1114 rt = tanhf (REALPART (a));
1115 it = tanf (IMAGPART (a));
1116 COMPLEX_ASSIGN (n, rt, it);
1117 COMPLEX_ASSIGN (d, 1, - (rt * it));
1123 #if !defined(HAVE_CTANH)
1124 #define HAVE_CTANH 1
1126 ctanh (double complex a)
1129 double complex n, d;
1131 rt = tanh (REALPART (a));
1132 it = tan (IMAGPART (a));
1133 COMPLEX_ASSIGN (n, rt, it);
1134 COMPLEX_ASSIGN (d, 1, - (rt * it));
1140 #if !defined(HAVE_CTANHL) && defined(HAVE_TANL) && defined(HAVE_TANHL)
1141 #define HAVE_CTANHL 1
1143 ctanhl (long double complex a)
1146 long double complex n, d;
1148 rt = tanhl (REALPART (a));
1149 it = tanl (IMAGPART (a));
1150 COMPLEX_ASSIGN (n, rt, it);
1151 COMPLEX_ASSIGN (d, 1, - (rt * it));
1158 /* sin(a + i b) = sin(a) cosh(b) + i cos(a) sinh(b) */
1159 #if !defined(HAVE_CSINF)
1160 #define HAVE_CSINF 1
1162 csinf (float complex a)
1169 COMPLEX_ASSIGN (v, sinf (r) * coshf (i), cosf (r) * sinhf (i));
1174 #if !defined(HAVE_CSIN)
1177 csin (double complex a)
1184 COMPLEX_ASSIGN (v, sin (r) * cosh (i), cos (r) * sinh (i));
1189 #if !defined(HAVE_CSINL) && defined(HAVE_COSL) && defined(HAVE_COSHL) && defined(HAVE_SINL) && defined(HAVE_SINHL)
1190 #define HAVE_CSINL 1
1192 csinl (long double complex a)
1195 long double complex v;
1199 COMPLEX_ASSIGN (v, sinl (r) * coshl (i), cosl (r) * sinhl (i));
1205 /* cos(a + i b) = cos(a) cosh(b) - i sin(a) sinh(b) */
1206 #if !defined(HAVE_CCOSF)
1207 #define HAVE_CCOSF 1
1209 ccosf (float complex a)
1216 COMPLEX_ASSIGN (v, cosf (r) * coshf (i), - (sinf (r) * sinhf (i)));
1221 #if !defined(HAVE_CCOS)
1224 ccos (double complex a)
1231 COMPLEX_ASSIGN (v, cos (r) * cosh (i), - (sin (r) * sinh (i)));
1236 #if !defined(HAVE_CCOSL) && defined(HAVE_COSL) && defined(HAVE_COSHL) && defined(HAVE_SINL) && defined(HAVE_SINHL)
1237 #define HAVE_CCOSL 1
1239 ccosl (long double complex a)
1242 long double complex v;
1246 COMPLEX_ASSIGN (v, cosl (r) * coshl (i), - (sinl (r) * sinhl (i)));
1252 /* tan(a + i b) = (tan(a) + i tanh(b)) / (1 - i tan(a) tanh(b)) */
1253 #if !defined(HAVE_CTANF)
1254 #define HAVE_CTANF 1
1256 ctanf (float complex a)
1261 rt = tanf (REALPART (a));
1262 it = tanhf (IMAGPART (a));
1263 COMPLEX_ASSIGN (n, rt, it);
1264 COMPLEX_ASSIGN (d, 1, - (rt * it));
1270 #if !defined(HAVE_CTAN)
1273 ctan (double complex a)
1276 double complex n, d;
1278 rt = tan (REALPART (a));
1279 it = tanh (IMAGPART (a));
1280 COMPLEX_ASSIGN (n, rt, it);
1281 COMPLEX_ASSIGN (d, 1, - (rt * it));
1287 #if !defined(HAVE_CTANL) && defined(HAVE_TANL) && defined(HAVE_TANHL)
1288 #define HAVE_CTANL 1
1290 ctanl (long double complex a)
1293 long double complex n, d;
1295 rt = tanl (REALPART (a));
1296 it = tanhl (IMAGPART (a));
1297 COMPLEX_ASSIGN (n, rt, it);
1298 COMPLEX_ASSIGN (d, 1, - (rt * it));