Index: gcc/libgfortran/intrinsics/c99_functions.c |
diff --git a/gcc/libgfortran/intrinsics/c99_functions.c b/gcc/libgfortran/intrinsics/c99_functions.c |
index 9b31702342082a784f288152b3a95a8ba2b95f92..03bcbfedaa642de6c3633115979f5282b602ef10 100644 |
--- a/gcc/libgfortran/intrinsics/c99_functions.c |
+++ b/gcc/libgfortran/intrinsics/c99_functions.c |
@@ -54,19 +54,20 @@ see the files COPYING3 and COPYING.RUNTIME respectively. If not, see |
#define cabsl __gfc_cabsl |
#endif |
-/* Prototypes to silence -Wstrict-prototypes -Wmissing-prototypes. */ |
- |
-float cabsf(float complex); |
-double cabs(double complex); |
-long double cabsl(long double complex); |
- |
-float cargf(float complex); |
-double carg(double complex); |
-long double cargl(long double complex); |
+/* On a C99 system "I" (with I*I = -1) should be defined in complex.h; |
+ if not, we define a fallback version here. */ |
+#ifndef I |
+# if defined(_Imaginary_I) |
+# define I _Imaginary_I |
+# elif defined(_Complex_I) |
+# define I _Complex_I |
+# else |
+# define I (1.0fi) |
+# endif |
+#endif |
-float complex clog10f(float complex); |
-double complex clog10(double complex); |
-long double complex clog10l(long double complex); |
+/* Prototypes are included to silence -Wstrict-prototypes |
+ -Wmissing-prototypes. */ |
/* Wrappers for systems without the various C99 single precision Bessel |
@@ -74,7 +75,7 @@ long double complex clog10l(long double complex); |
#if defined(HAVE_J0) && ! defined(HAVE_J0F) |
#define HAVE_J0F 1 |
-extern float j0f (float); |
+float j0f (float); |
float |
j0f (float x) |
@@ -85,7 +86,7 @@ j0f (float x) |
#if defined(HAVE_J1) && !defined(HAVE_J1F) |
#define HAVE_J1F 1 |
-extern float j1f (float); |
+float j1f (float); |
float j1f (float x) |
{ |
@@ -95,7 +96,7 @@ float j1f (float x) |
#if defined(HAVE_JN) && !defined(HAVE_JNF) |
#define HAVE_JNF 1 |
-extern float jnf (int, float); |
+float jnf (int, float); |
float |
jnf (int n, float x) |
@@ -106,7 +107,7 @@ jnf (int n, float x) |
#if defined(HAVE_Y0) && !defined(HAVE_Y0F) |
#define HAVE_Y0F 1 |
-extern float y0f (float); |
+float y0f (float); |
float |
y0f (float x) |
@@ -117,7 +118,7 @@ y0f (float x) |
#if defined(HAVE_Y1) && !defined(HAVE_Y1F) |
#define HAVE_Y1F 1 |
-extern float y1f (float); |
+float y1f (float); |
float |
y1f (float x) |
@@ -128,7 +129,7 @@ y1f (float x) |
#if defined(HAVE_YN) && !defined(HAVE_YNF) |
#define HAVE_YNF 1 |
-extern float ynf (int, float); |
+float ynf (int, float); |
float |
ynf (int n, float x) |
@@ -142,7 +143,7 @@ ynf (int n, float x) |
#if defined(HAVE_ERF) && !defined(HAVE_ERFF) |
#define HAVE_ERFF 1 |
-extern float erff (float); |
+float erff (float); |
float |
erff (float x) |
@@ -153,7 +154,7 @@ erff (float x) |
#if defined(HAVE_ERFC) && !defined(HAVE_ERFCF) |
#define HAVE_ERFCF 1 |
-extern float erfcf (float); |
+float erfcf (float); |
float |
erfcf (float x) |
@@ -165,14 +166,18 @@ erfcf (float x) |
#ifndef HAVE_ACOSF |
#define HAVE_ACOSF 1 |
+float acosf (float x); |
+ |
float |
-acosf(float x) |
+acosf (float x) |
{ |
- return (float) acos(x); |
+ return (float) acos (x); |
} |
#endif |
#if HAVE_ACOSH && !HAVE_ACOSHF |
+float acoshf (float x); |
+ |
float |
acoshf (float x) |
{ |
@@ -182,14 +187,18 @@ acoshf (float x) |
#ifndef HAVE_ASINF |
#define HAVE_ASINF 1 |
+float asinf (float x); |
+ |
float |
-asinf(float x) |
+asinf (float x) |
{ |
- return (float) asin(x); |
+ return (float) asin (x); |
} |
#endif |
#if HAVE_ASINH && !HAVE_ASINHF |
+float asinhf (float x); |
+ |
float |
asinhf (float x) |
{ |
@@ -199,23 +208,29 @@ asinhf (float x) |
#ifndef HAVE_ATAN2F |
#define HAVE_ATAN2F 1 |
+float atan2f (float y, float x); |
+ |
float |
-atan2f(float y, float x) |
+atan2f (float y, float x) |
{ |
- return (float) atan2(y, x); |
+ return (float) atan2 (y, x); |
} |
#endif |
#ifndef HAVE_ATANF |
#define HAVE_ATANF 1 |
+float atanf (float x); |
+ |
float |
-atanf(float x) |
+atanf (float x) |
{ |
- return (float) atan(x); |
+ return (float) atan (x); |
} |
#endif |
#if HAVE_ATANH && !HAVE_ATANHF |
+float atanhf (float x); |
+ |
float |
atanhf (float x) |
{ |
@@ -225,69 +240,85 @@ atanhf (float x) |
#ifndef HAVE_CEILF |
#define HAVE_CEILF 1 |
+float ceilf (float x); |
+ |
float |
-ceilf(float x) |
+ceilf (float x) |
{ |
- return (float) ceil(x); |
+ return (float) ceil (x); |
} |
#endif |
#ifndef HAVE_COPYSIGNF |
#define HAVE_COPYSIGNF 1 |
+float copysignf (float x, float y); |
+ |
float |
-copysignf(float x, float y) |
+copysignf (float x, float y) |
{ |
- return (float) copysign(x, y); |
+ return (float) copysign (x, y); |
} |
#endif |
#ifndef HAVE_COSF |
#define HAVE_COSF 1 |
+float cosf (float x); |
+ |
float |
-cosf(float x) |
+cosf (float x) |
{ |
- return (float) cos(x); |
+ return (float) cos (x); |
} |
#endif |
#ifndef HAVE_COSHF |
#define HAVE_COSHF 1 |
+float coshf (float x); |
+ |
float |
-coshf(float x) |
+coshf (float x) |
{ |
- return (float) cosh(x); |
+ return (float) cosh (x); |
} |
#endif |
#ifndef HAVE_EXPF |
#define HAVE_EXPF 1 |
+float expf (float x); |
+ |
float |
-expf(float x) |
+expf (float x) |
{ |
- return (float) exp(x); |
+ return (float) exp (x); |
} |
#endif |
#ifndef HAVE_FABSF |
#define HAVE_FABSF 1 |
+float fabsf (float x); |
+ |
float |
-fabsf(float x) |
+fabsf (float x) |
{ |
- return (float) fabs(x); |
+ return (float) fabs (x); |
} |
#endif |
#ifndef HAVE_FLOORF |
#define HAVE_FLOORF 1 |
+float floorf (float x); |
+ |
float |
-floorf(float x) |
+floorf (float x) |
{ |
- return (float) floor(x); |
+ return (float) floor (x); |
} |
#endif |
#ifndef HAVE_FMODF |
#define HAVE_FMODF 1 |
+float fmodf (float x, float y); |
+ |
float |
fmodf (float x, float y) |
{ |
@@ -297,111 +328,135 @@ fmodf (float x, float y) |
#ifndef HAVE_FREXPF |
#define HAVE_FREXPF 1 |
+float frexpf (float x, int *exp); |
+ |
float |
-frexpf(float x, int *exp) |
+frexpf (float x, int *exp) |
{ |
- return (float) frexp(x, exp); |
+ return (float) frexp (x, exp); |
} |
#endif |
#ifndef HAVE_HYPOTF |
#define HAVE_HYPOTF 1 |
+float hypotf (float x, float y); |
+ |
float |
-hypotf(float x, float y) |
+hypotf (float x, float y) |
{ |
- return (float) hypot(x, y); |
+ return (float) hypot (x, y); |
} |
#endif |
#ifndef HAVE_LOGF |
#define HAVE_LOGF 1 |
+float logf (float x); |
+ |
float |
-logf(float x) |
+logf (float x) |
{ |
- return (float) log(x); |
+ return (float) log (x); |
} |
#endif |
#ifndef HAVE_LOG10F |
#define HAVE_LOG10F 1 |
+float log10f (float x); |
+ |
float |
-log10f(float x) |
+log10f (float x) |
{ |
- return (float) log10(x); |
+ return (float) log10 (x); |
} |
#endif |
#ifndef HAVE_SCALBN |
#define HAVE_SCALBN 1 |
+double scalbn (double x, int y); |
+ |
double |
-scalbn(double x, int y) |
+scalbn (double x, int y) |
{ |
#if (FLT_RADIX == 2) && defined(HAVE_LDEXP) |
return ldexp (x, y); |
#else |
- return x * pow(FLT_RADIX, y); |
+ return x * pow (FLT_RADIX, y); |
#endif |
} |
#endif |
#ifndef HAVE_SCALBNF |
#define HAVE_SCALBNF 1 |
+float scalbnf (float x, int y); |
+ |
float |
-scalbnf(float x, int y) |
+scalbnf (float x, int y) |
{ |
- return (float) scalbn(x, y); |
+ return (float) scalbn (x, y); |
} |
#endif |
#ifndef HAVE_SINF |
#define HAVE_SINF 1 |
+float sinf (float x); |
+ |
float |
-sinf(float x) |
+sinf (float x) |
{ |
- return (float) sin(x); |
+ return (float) sin (x); |
} |
#endif |
#ifndef HAVE_SINHF |
#define HAVE_SINHF 1 |
+float sinhf (float x); |
+ |
float |
-sinhf(float x) |
+sinhf (float x) |
{ |
- return (float) sinh(x); |
+ return (float) sinh (x); |
} |
#endif |
#ifndef HAVE_SQRTF |
#define HAVE_SQRTF 1 |
+float sqrtf (float x); |
+ |
float |
-sqrtf(float x) |
+sqrtf (float x) |
{ |
- return (float) sqrt(x); |
+ return (float) sqrt (x); |
} |
#endif |
#ifndef HAVE_TANF |
#define HAVE_TANF 1 |
+float tanf (float x); |
+ |
float |
-tanf(float x) |
+tanf (float x) |
{ |
- return (float) tan(x); |
+ return (float) tan (x); |
} |
#endif |
#ifndef HAVE_TANHF |
#define HAVE_TANHF 1 |
+float tanhf (float x); |
+ |
float |
-tanhf(float x) |
+tanhf (float x) |
{ |
- return (float) tanh(x); |
+ return (float) tanh (x); |
} |
#endif |
#ifndef HAVE_TRUNC |
#define HAVE_TRUNC 1 |
+double trunc (double x); |
+ |
double |
-trunc(double x) |
+trunc (double x) |
{ |
if (!isfinite (x)) |
return x; |
@@ -415,8 +470,10 @@ trunc(double x) |
#ifndef HAVE_TRUNCF |
#define HAVE_TRUNCF 1 |
+float truncf (float x); |
+ |
float |
-truncf(float x) |
+truncf (float x) |
{ |
return (float) trunc (x); |
} |
@@ -427,15 +484,17 @@ truncf(float x) |
/* This is a portable implementation of nextafterf that is intended to be |
independent of the floating point format or its in memory representation. |
This implementation works correctly with denormalized values. */ |
+float nextafterf (float x, float y); |
+ |
float |
-nextafterf(float x, float y) |
+nextafterf (float x, float y) |
{ |
/* This variable is marked volatile to avoid excess precision problems |
on some platforms, including IA-32. */ |
volatile float delta; |
float absx, denorm_min; |
- if (isnan(x) || isnan(y)) |
+ if (isnan (x) || isnan (y)) |
return x + y; |
if (x == y) |
return x; |
@@ -490,10 +549,12 @@ nextafterf(float x, float y) |
#ifndef HAVE_POWF |
#define HAVE_POWF 1 |
#endif |
+float powf (float x, float y); |
+ |
float |
-powf(float x, float y) |
+powf (float x, float y) |
{ |
- return (float) pow(x, y); |
+ return (float) pow (x, y); |
} |
#endif |
@@ -503,12 +564,14 @@ powf(float x, float y) |
#if !defined(HAVE_ROUNDL) |
#define HAVE_ROUNDL 1 |
+long double roundl (long double x); |
+ |
#if defined(HAVE_CEILL) |
/* Round to nearest integral value. If the argument is halfway between two |
integral values then round away from zero. */ |
long double |
-roundl(long double x) |
+roundl (long double x) |
{ |
long double t; |
if (!isfinite (x)) |
@@ -516,14 +579,14 @@ roundl(long double x) |
if (x >= 0.0) |
{ |
- t = ceill(x); |
+ t = ceill (x); |
if (t - x > 0.5) |
t -= 1.0; |
return (t); |
} |
else |
{ |
- t = ceill(-x); |
+ t = ceill (-x); |
if (t + x > 0.5) |
t -= 1.0; |
return (-t); |
@@ -533,7 +596,7 @@ roundl(long double x) |
/* Poor version of roundl for system that don't have ceill. */ |
long double |
-roundl(long double x) |
+roundl (long double x) |
{ |
if (x > DBL_MAX || x < -DBL_MAX) |
{ |
@@ -546,7 +609,7 @@ roundl(long double x) |
} |
else |
/* Use round(). */ |
- return round((double) x); |
+ return round ((double) x); |
} |
#endif |
@@ -556,9 +619,10 @@ roundl(long double x) |
#define HAVE_ROUND 1 |
/* Round to nearest integral value. If the argument is halfway between two |
integral values then round away from zero. */ |
+double round (double x); |
double |
-round(double x) |
+round (double x) |
{ |
double t; |
if (!isfinite (x)) |
@@ -566,16 +630,16 @@ round(double x) |
if (x >= 0.0) |
{ |
- t = ceil(x); |
- if (t - x > 0.5) |
- t -= 1.0; |
+ t = floor (x); |
+ if (t - x <= -0.5) |
+ t += 1.0; |
return (t); |
} |
else |
{ |
- t = ceil(-x); |
- if (t + x > 0.5) |
- t -= 1.0; |
+ t = floor (-x); |
+ if (t + x <= -0.5) |
+ t += 1.0; |
return (-t); |
} |
} |
@@ -585,9 +649,10 @@ round(double x) |
#define HAVE_ROUNDF 1 |
/* Round to nearest integral value. If the argument is halfway between two |
integral values then round away from zero. */ |
+float roundf (float x); |
float |
-roundf(float x) |
+roundf (float x) |
{ |
float t; |
if (!isfinite (x)) |
@@ -595,16 +660,16 @@ roundf(float x) |
if (x >= 0.0) |
{ |
- t = ceilf(x); |
- if (t - x > 0.5) |
- t -= 1.0; |
+ t = floorf (x); |
+ if (t - x <= -0.5) |
+ t += 1.0; |
return (t); |
} |
else |
{ |
- t = ceilf(-x); |
- if (t + x > 0.5) |
- t -= 1.0; |
+ t = floorf (-x); |
+ if (t + x <= -0.5) |
+ t += 1.0; |
return (-t); |
} |
} |
@@ -615,6 +680,8 @@ roundf(float x) |
#if !defined(HAVE_LROUNDF) && defined(HAVE_ROUNDF) |
#define HAVE_LROUNDF 1 |
+long int lroundf (float x); |
+ |
long int |
lroundf (float x) |
{ |
@@ -624,6 +691,8 @@ lroundf (float x) |
#if !defined(HAVE_LROUND) && defined(HAVE_ROUND) |
#define HAVE_LROUND 1 |
+long int lround (double x); |
+ |
long int |
lround (double x) |
{ |
@@ -633,6 +702,8 @@ lround (double x) |
#if !defined(HAVE_LROUNDL) && defined(HAVE_ROUNDL) |
#define HAVE_LROUNDL 1 |
+long int lroundl (long double x); |
+ |
long int |
lroundl (long double x) |
{ |
@@ -642,6 +713,8 @@ lroundl (long double x) |
#if !defined(HAVE_LLROUNDF) && defined(HAVE_ROUNDF) |
#define HAVE_LLROUNDF 1 |
+long long int llroundf (float x); |
+ |
long long int |
llroundf (float x) |
{ |
@@ -651,6 +724,8 @@ llroundf (float x) |
#if !defined(HAVE_LLROUND) && defined(HAVE_ROUND) |
#define HAVE_LLROUND 1 |
+long long int llround (double x); |
+ |
long long int |
llround (double x) |
{ |
@@ -660,6 +735,8 @@ llround (double x) |
#if !defined(HAVE_LLROUNDL) && defined(HAVE_ROUNDL) |
#define HAVE_LLROUNDL 1 |
+long long int llroundl (long double x); |
+ |
long long int |
llroundl (long double x) |
{ |
@@ -672,8 +749,10 @@ llroundl (long double x) |
#define HAVE_LOG10L 1 |
/* log10 function for long double variables. The version provided here |
reduces the argument until it fits into a double, then use log10. */ |
+long double log10l (long double x); |
+ |
long double |
-log10l(long double x) |
+log10l (long double x) |
{ |
#if LDBL_MAX_EXP > DBL_MAX_EXP |
if (x > DBL_MAX) |
@@ -699,7 +778,7 @@ log10l(long double x) |
if (x < 0x1p-4093L) { p2_result += 4093; x /= 0x1p-4093L; } |
if (x < 0x1p-2045L) { p2_result += 2045; x /= 0x1p-2045L; } |
if (x < 0x1p-1021L) { p2_result += 1021; x /= 0x1p-1021L; } |
- val = fabs(log10 ((double) x)); |
+ val = fabs (log10 ((double) x)); |
return (- val - p2_result * .30102999566398119521373889472449302L); |
} |
#endif |
@@ -710,6 +789,8 @@ log10l(long double x) |
#ifndef HAVE_FLOORL |
#define HAVE_FLOORL 1 |
+long double floorl (long double x); |
+ |
long double |
floorl (long double x) |
{ |
@@ -736,6 +817,8 @@ floorl (long double x) |
#ifndef HAVE_FMODL |
#define HAVE_FMODL 1 |
+long double fmodl (long double x, long double y); |
+ |
long double |
fmodl (long double x, long double y) |
{ |
@@ -751,6 +834,8 @@ fmodl (long double x, long double y) |
#if !defined(HAVE_CABSF) |
#define HAVE_CABSF 1 |
+float cabsf (float complex z); |
+ |
float |
cabsf (float complex z) |
{ |
@@ -760,6 +845,8 @@ cabsf (float complex z) |
#if !defined(HAVE_CABS) |
#define HAVE_CABS 1 |
+double cabs (double complex z); |
+ |
double |
cabs (double complex z) |
{ |
@@ -769,6 +856,8 @@ cabs (double complex z) |
#if !defined(HAVE_CABSL) && defined(HAVE_HYPOTL) |
#define HAVE_CABSL 1 |
+long double cabsl (long double complex z); |
+ |
long double |
cabsl (long double complex z) |
{ |
@@ -779,6 +868,8 @@ cabsl (long double complex z) |
#if !defined(HAVE_CARGF) |
#define HAVE_CARGF 1 |
+float cargf (float complex z); |
+ |
float |
cargf (float complex z) |
{ |
@@ -788,6 +879,8 @@ cargf (float complex z) |
#if !defined(HAVE_CARG) |
#define HAVE_CARG 1 |
+double carg (double complex z); |
+ |
double |
carg (double complex z) |
{ |
@@ -797,6 +890,8 @@ carg (double complex z) |
#if !defined(HAVE_CARGL) && defined(HAVE_ATAN2L) |
#define HAVE_CARGL 1 |
+long double cargl (long double complex z); |
+ |
long double |
cargl (long double complex z) |
{ |
@@ -808,6 +903,8 @@ cargl (long double complex z) |
/* exp(z) = exp(a)*(cos(b) + i sin(b)) */ |
#if !defined(HAVE_CEXPF) |
#define HAVE_CEXPF 1 |
+float complex cexpf (float complex z); |
+ |
float complex |
cexpf (float complex z) |
{ |
@@ -823,6 +920,8 @@ cexpf (float complex z) |
#if !defined(HAVE_CEXP) |
#define HAVE_CEXP 1 |
+double complex cexp (double complex z); |
+ |
double complex |
cexp (double complex z) |
{ |
@@ -838,6 +937,8 @@ cexp (double complex z) |
#if !defined(HAVE_CEXPL) && defined(HAVE_COSL) && defined(HAVE_SINL) && defined(EXPL) |
#define HAVE_CEXPL 1 |
+long double complex cexpl (long double complex z); |
+ |
long double complex |
cexpl (long double complex z) |
{ |
@@ -855,6 +956,8 @@ cexpl (long double complex z) |
/* log(z) = log (cabs(z)) + i*carg(z) */ |
#if !defined(HAVE_CLOGF) |
#define HAVE_CLOGF 1 |
+float complex clogf (float complex z); |
+ |
float complex |
clogf (float complex z) |
{ |
@@ -867,6 +970,8 @@ clogf (float complex z) |
#if !defined(HAVE_CLOG) |
#define HAVE_CLOG 1 |
+double complex clog (double complex z); |
+ |
double complex |
clog (double complex z) |
{ |
@@ -879,6 +984,8 @@ clog (double complex z) |
#if !defined(HAVE_CLOGL) && defined(HAVE_LOGL) && defined(HAVE_CABSL) && defined(HAVE_CARGL) |
#define HAVE_CLOGL 1 |
+long double complex clogl (long double complex z); |
+ |
long double complex |
clogl (long double complex z) |
{ |
@@ -893,6 +1000,8 @@ clogl (long double complex z) |
/* log10(z) = log10 (cabs(z)) + i*carg(z) */ |
#if !defined(HAVE_CLOG10F) |
#define HAVE_CLOG10F 1 |
+float complex clog10f (float complex z); |
+ |
float complex |
clog10f (float complex z) |
{ |
@@ -905,6 +1014,8 @@ clog10f (float complex z) |
#if !defined(HAVE_CLOG10) |
#define HAVE_CLOG10 1 |
+double complex clog10 (double complex z); |
+ |
double complex |
clog10 (double complex z) |
{ |
@@ -917,6 +1028,8 @@ clog10 (double complex z) |
#if !defined(HAVE_CLOG10L) && defined(HAVE_LOG10L) && defined(HAVE_CABSL) && defined(HAVE_CARGL) |
#define HAVE_CLOG10L 1 |
+long double complex clog10l (long double complex z); |
+ |
long double complex |
clog10l (long double complex z) |
{ |
@@ -931,6 +1044,8 @@ clog10l (long double complex z) |
/* pow(base, power) = cexp (power * clog (base)) */ |
#if !defined(HAVE_CPOWF) |
#define HAVE_CPOWF 1 |
+float complex cpowf (float complex base, float complex power); |
+ |
float complex |
cpowf (float complex base, float complex power) |
{ |
@@ -940,6 +1055,8 @@ cpowf (float complex base, float complex power) |
#if !defined(HAVE_CPOW) |
#define HAVE_CPOW 1 |
+double complex cpow (double complex base, double complex power); |
+ |
double complex |
cpow (double complex base, double complex power) |
{ |
@@ -949,6 +1066,8 @@ cpow (double complex base, double complex power) |
#if !defined(HAVE_CPOWL) && defined(HAVE_CEXPL) && defined(HAVE_CLOGL) |
#define HAVE_CPOWL 1 |
+long double complex cpowl (long double complex base, long double complex power); |
+ |
long double complex |
cpowl (long double complex base, long double complex power) |
{ |
@@ -960,6 +1079,8 @@ cpowl (long double complex base, long double complex power) |
/* sqrt(z). Algorithm pulled from glibc. */ |
#if !defined(HAVE_CSQRTF) |
#define HAVE_CSQRTF 1 |
+float complex csqrtf (float complex z); |
+ |
float complex |
csqrtf (float complex z) |
{ |
@@ -1013,6 +1134,8 @@ csqrtf (float complex z) |
#if !defined(HAVE_CSQRT) |
#define HAVE_CSQRT 1 |
+double complex csqrt (double complex z); |
+ |
double complex |
csqrt (double complex z) |
{ |
@@ -1066,6 +1189,8 @@ csqrt (double complex z) |
#if !defined(HAVE_CSQRTL) && defined(HAVE_COPYSIGNL) && defined(HAVE_SQRTL) && defined(HAVE_FABSL) && defined(HAVE_HYPOTL) |
#define HAVE_CSQRTL 1 |
+long double complex csqrtl (long double complex z); |
+ |
long double complex |
csqrtl (long double complex z) |
{ |
@@ -1121,6 +1246,8 @@ csqrtl (long double complex z) |
/* sinh(a + i b) = sinh(a) cos(b) + i cosh(a) sin(b) */ |
#if !defined(HAVE_CSINHF) |
#define HAVE_CSINHF 1 |
+float complex csinhf (float complex a); |
+ |
float complex |
csinhf (float complex a) |
{ |
@@ -1136,6 +1263,8 @@ csinhf (float complex a) |
#if !defined(HAVE_CSINH) |
#define HAVE_CSINH 1 |
+double complex csinh (double complex a); |
+ |
double complex |
csinh (double complex a) |
{ |
@@ -1151,6 +1280,8 @@ csinh (double complex a) |
#if !defined(HAVE_CSINHL) && defined(HAVE_COSL) && defined(HAVE_COSHL) && defined(HAVE_SINL) && defined(HAVE_SINHL) |
#define HAVE_CSINHL 1 |
+long double complex csinhl (long double complex a); |
+ |
long double complex |
csinhl (long double complex a) |
{ |
@@ -1165,9 +1296,11 @@ csinhl (long double complex a) |
#endif |
-/* cosh(a + i b) = cosh(a) cos(b) - i sinh(a) sin(b) */ |
+/* cosh(a + i b) = cosh(a) cos(b) + i sinh(a) sin(b) */ |
#if !defined(HAVE_CCOSHF) |
#define HAVE_CCOSHF 1 |
+float complex ccoshf (float complex a); |
+ |
float complex |
ccoshf (float complex a) |
{ |
@@ -1176,13 +1309,15 @@ ccoshf (float complex a) |
r = REALPART (a); |
i = IMAGPART (a); |
- COMPLEX_ASSIGN (v, coshf (r) * cosf (i), - (sinhf (r) * sinf (i))); |
+ COMPLEX_ASSIGN (v, coshf (r) * cosf (i), sinhf (r) * sinf (i)); |
return v; |
} |
#endif |
#if !defined(HAVE_CCOSH) |
#define HAVE_CCOSH 1 |
+double complex ccosh (double complex a); |
+ |
double complex |
ccosh (double complex a) |
{ |
@@ -1191,13 +1326,15 @@ ccosh (double complex a) |
r = REALPART (a); |
i = IMAGPART (a); |
- COMPLEX_ASSIGN (v, cosh (r) * cos (i), - (sinh (r) * sin (i))); |
+ COMPLEX_ASSIGN (v, cosh (r) * cos (i), sinh (r) * sin (i)); |
return v; |
} |
#endif |
#if !defined(HAVE_CCOSHL) && defined(HAVE_COSL) && defined(HAVE_COSHL) && defined(HAVE_SINL) && defined(HAVE_SINHL) |
#define HAVE_CCOSHL 1 |
+long double complex ccoshl (long double complex a); |
+ |
long double complex |
ccoshl (long double complex a) |
{ |
@@ -1206,15 +1343,17 @@ ccoshl (long double complex a) |
r = REALPART (a); |
i = IMAGPART (a); |
- COMPLEX_ASSIGN (v, coshl (r) * cosl (i), - (sinhl (r) * sinl (i))); |
+ COMPLEX_ASSIGN (v, coshl (r) * cosl (i), sinhl (r) * sinl (i)); |
return v; |
} |
#endif |
-/* tanh(a + i b) = (tanh(a) + i tan(b)) / (1 - i tanh(a) tan(b)) */ |
+/* tanh(a + i b) = (tanh(a) + i tan(b)) / (1 + i tanh(a) tan(b)) */ |
#if !defined(HAVE_CTANHF) |
#define HAVE_CTANHF 1 |
+float complex ctanhf (float complex a); |
+ |
float complex |
ctanhf (float complex a) |
{ |
@@ -1224,7 +1363,7 @@ ctanhf (float complex a) |
rt = tanhf (REALPART (a)); |
it = tanf (IMAGPART (a)); |
COMPLEX_ASSIGN (n, rt, it); |
- COMPLEX_ASSIGN (d, 1, - (rt * it)); |
+ COMPLEX_ASSIGN (d, 1, rt * it); |
return n / d; |
} |
@@ -1232,6 +1371,7 @@ ctanhf (float complex a) |
#if !defined(HAVE_CTANH) |
#define HAVE_CTANH 1 |
+double complex ctanh (double complex a); |
double complex |
ctanh (double complex a) |
{ |
@@ -1241,7 +1381,7 @@ ctanh (double complex a) |
rt = tanh (REALPART (a)); |
it = tan (IMAGPART (a)); |
COMPLEX_ASSIGN (n, rt, it); |
- COMPLEX_ASSIGN (d, 1, - (rt * it)); |
+ COMPLEX_ASSIGN (d, 1, rt * it); |
return n / d; |
} |
@@ -1249,6 +1389,8 @@ ctanh (double complex a) |
#if !defined(HAVE_CTANHL) && defined(HAVE_TANL) && defined(HAVE_TANHL) |
#define HAVE_CTANHL 1 |
+long double complex ctanhl (long double complex a); |
+ |
long double complex |
ctanhl (long double complex a) |
{ |
@@ -1258,7 +1400,7 @@ ctanhl (long double complex a) |
rt = tanhl (REALPART (a)); |
it = tanl (IMAGPART (a)); |
COMPLEX_ASSIGN (n, rt, it); |
- COMPLEX_ASSIGN (d, 1, - (rt * it)); |
+ COMPLEX_ASSIGN (d, 1, rt * it); |
return n / d; |
} |
@@ -1268,6 +1410,8 @@ ctanhl (long double complex a) |
/* sin(a + i b) = sin(a) cosh(b) + i cos(a) sinh(b) */ |
#if !defined(HAVE_CSINF) |
#define HAVE_CSINF 1 |
+float complex csinf (float complex a); |
+ |
float complex |
csinf (float complex a) |
{ |
@@ -1283,6 +1427,8 @@ csinf (float complex a) |
#if !defined(HAVE_CSIN) |
#define HAVE_CSIN 1 |
+double complex csin (double complex a); |
+ |
double complex |
csin (double complex a) |
{ |
@@ -1298,6 +1444,8 @@ csin (double complex a) |
#if !defined(HAVE_CSINL) && defined(HAVE_COSL) && defined(HAVE_COSHL) && defined(HAVE_SINL) && defined(HAVE_SINHL) |
#define HAVE_CSINL 1 |
+long double complex csinl (long double complex a); |
+ |
long double complex |
csinl (long double complex a) |
{ |
@@ -1315,6 +1463,8 @@ csinl (long double complex a) |
/* cos(a + i b) = cos(a) cosh(b) - i sin(a) sinh(b) */ |
#if !defined(HAVE_CCOSF) |
#define HAVE_CCOSF 1 |
+float complex ccosf (float complex a); |
+ |
float complex |
ccosf (float complex a) |
{ |
@@ -1330,6 +1480,8 @@ ccosf (float complex a) |
#if !defined(HAVE_CCOS) |
#define HAVE_CCOS 1 |
+double complex ccos (double complex a); |
+ |
double complex |
ccos (double complex a) |
{ |
@@ -1345,6 +1497,8 @@ ccos (double complex a) |
#if !defined(HAVE_CCOSL) && defined(HAVE_COSL) && defined(HAVE_COSHL) && defined(HAVE_SINL) && defined(HAVE_SINHL) |
#define HAVE_CCOSL 1 |
+long double complex ccosl (long double complex a); |
+ |
long double complex |
ccosl (long double complex a) |
{ |
@@ -1362,6 +1516,8 @@ ccosl (long double complex a) |
/* tan(a + i b) = (tan(a) + i tanh(b)) / (1 - i tan(a) tanh(b)) */ |
#if !defined(HAVE_CTANF) |
#define HAVE_CTANF 1 |
+float complex ctanf (float complex a); |
+ |
float complex |
ctanf (float complex a) |
{ |
@@ -1379,6 +1535,8 @@ ctanf (float complex a) |
#if !defined(HAVE_CTAN) |
#define HAVE_CTAN 1 |
+double complex ctan (double complex a); |
+ |
double complex |
ctan (double complex a) |
{ |
@@ -1396,6 +1554,8 @@ ctan (double complex a) |
#if !defined(HAVE_CTANL) && defined(HAVE_TANL) && defined(HAVE_TANHL) |
#define HAVE_CTANL 1 |
+long double complex ctanl (long double complex a); |
+ |
long double complex |
ctanl (long double complex a) |
{ |
@@ -1412,10 +1572,242 @@ ctanl (long double complex a) |
#endif |
+/* Complex ASIN. Returns wrongly NaN for infinite arguments. |
+ Algorithm taken from Abramowitz & Stegun. */ |
+ |
+#if !defined(HAVE_CASINF) && defined(HAVE_CLOGF) && defined(HAVE_CSQRTF) |
+#define HAVE_CASINF 1 |
+complex float casinf (complex float z); |
+ |
+complex float |
+casinf (complex float z) |
+{ |
+ return -I*clogf (I*z + csqrtf (1.0f-z*z)); |
+} |
+#endif |
+ |
+ |
+#if !defined(HAVE_CASIN) && defined(HAVE_CLOG) && defined(HAVE_CSQRT) |
+#define HAVE_CASIN 1 |
+complex double casin (complex double z); |
+ |
+complex double |
+casin (complex double z) |
+{ |
+ return -I*clog (I*z + csqrt (1.0-z*z)); |
+} |
+#endif |
+ |
+ |
+#if !defined(HAVE_CASINL) && defined(HAVE_CLOGL) && defined(HAVE_CSQRTL) |
+#define HAVE_CASINL 1 |
+complex long double casinl (complex long double z); |
+ |
+complex long double |
+casinl (complex long double z) |
+{ |
+ return -I*clogl (I*z + csqrtl (1.0L-z*z)); |
+} |
+#endif |
+ |
+ |
+/* Complex ACOS. Returns wrongly NaN for infinite arguments. |
+ Algorithm taken from Abramowitz & Stegun. */ |
+ |
+#if !defined(HAVE_CACOSF) && defined(HAVE_CLOGF) && defined(HAVE_CSQRTF) |
+#define HAVE_CACOSF 1 |
+complex float cacosf (complex float z); |
+ |
+complex float |
+cacosf (complex float z) |
+{ |
+ return -I*clogf (z + I*csqrtf (1.0f-z*z)); |
+} |
+#endif |
+ |
+ |
+#if !defined(HAVE_CACOS) && defined(HAVE_CLOG) && defined(HAVE_CSQRT) |
+#define HAVE_CACOS 1 |
+complex double cacos (complex double z); |
+ |
+complex double |
+cacos (complex double z) |
+{ |
+ return -I*clog (z + I*csqrt (1.0-z*z)); |
+} |
+#endif |
+ |
+ |
+#if !defined(HAVE_CACOSL) && defined(HAVE_CLOGL) && defined(HAVE_CSQRTL) |
+#define HAVE_CACOSL 1 |
+complex long double cacosl (complex long double z); |
+ |
+complex long double |
+cacosl (complex long double z) |
+{ |
+ return -I*clogl (z + I*csqrtl (1.0L-z*z)); |
+} |
+#endif |
+ |
+ |
+/* Complex ATAN. Returns wrongly NaN for infinite arguments. |
+ Algorithm taken from Abramowitz & Stegun. */ |
+ |
+#if !defined(HAVE_CATANF) && defined(HAVE_CLOGF) |
+#define HAVE_CACOSF 1 |
+complex float catanf (complex float z); |
+ |
+complex float |
+catanf (complex float z) |
+{ |
+ return I*clogf ((I+z)/(I-z))/2.0f; |
+} |
+#endif |
+ |
+ |
+#if !defined(HAVE_CATAN) && defined(HAVE_CLOG) |
+#define HAVE_CACOS 1 |
+complex double catan (complex double z); |
+ |
+complex double |
+catan (complex double z) |
+{ |
+ return I*clog ((I+z)/(I-z))/2.0; |
+} |
+#endif |
+ |
+ |
+#if !defined(HAVE_CATANL) && defined(HAVE_CLOGL) |
+#define HAVE_CACOSL 1 |
+complex long double catanl (complex long double z); |
+ |
+complex long double |
+catanl (complex long double z) |
+{ |
+ return I*clogl ((I+z)/(I-z))/2.0L; |
+} |
+#endif |
+ |
+ |
+/* Complex ASINH. Returns wrongly NaN for infinite arguments. |
+ Algorithm taken from Abramowitz & Stegun. */ |
+ |
+#if !defined(HAVE_CASINHF) && defined(HAVE_CLOGF) && defined(HAVE_CSQRTF) |
+#define HAVE_CASINHF 1 |
+complex float casinhf (complex float z); |
+ |
+complex float |
+casinhf (complex float z) |
+{ |
+ return clogf (z + csqrtf (z*z+1.0f)); |
+} |
+#endif |
+ |
+ |
+#if !defined(HAVE_CASINH) && defined(HAVE_CLOG) && defined(HAVE_CSQRT) |
+#define HAVE_CASINH 1 |
+complex double casinh (complex double z); |
+ |
+complex double |
+casinh (complex double z) |
+{ |
+ return clog (z + csqrt (z*z+1.0)); |
+} |
+#endif |
+ |
+ |
+#if !defined(HAVE_CASINHL) && defined(HAVE_CLOGL) && defined(HAVE_CSQRTL) |
+#define HAVE_CASINHL 1 |
+complex long double casinhl (complex long double z); |
+ |
+complex long double |
+casinhl (complex long double z) |
+{ |
+ return clogl (z + csqrtl (z*z+1.0L)); |
+} |
+#endif |
+ |
+ |
+/* Complex ACOSH. Returns wrongly NaN for infinite arguments. |
+ Algorithm taken from Abramowitz & Stegun. */ |
+ |
+#if !defined(HAVE_CACOSHF) && defined(HAVE_CLOGF) && defined(HAVE_CSQRTF) |
+#define HAVE_CACOSHF 1 |
+complex float cacoshf (complex float z); |
+ |
+complex float |
+cacoshf (complex float z) |
+{ |
+ return clogf (z + csqrtf (z-1.0f) * csqrtf (z+1.0f)); |
+} |
+#endif |
+ |
+ |
+#if !defined(HAVE_CACOSH) && defined(HAVE_CLOG) && defined(HAVE_CSQRT) |
+#define HAVE_CACOSH 1 |
+complex double cacosh (complex double z); |
+ |
+complex double |
+cacosh (complex double z) |
+{ |
+ return clog (z + csqrt (z-1.0) * csqrt (z+1.0)); |
+} |
+#endif |
+ |
+ |
+#if !defined(HAVE_CACOSHL) && defined(HAVE_CLOGL) && defined(HAVE_CSQRTL) |
+#define HAVE_CACOSHL 1 |
+complex long double cacoshl (complex long double z); |
+ |
+complex long double |
+cacoshl (complex long double z) |
+{ |
+ return clogl (z + csqrtl (z-1.0L) * csqrtl (z+1.0L)); |
+} |
+#endif |
+ |
+ |
+/* Complex ATANH. Returns wrongly NaN for infinite arguments. |
+ Algorithm taken from Abramowitz & Stegun. */ |
+ |
+#if !defined(HAVE_CATANHF) && defined(HAVE_CLOGF) |
+#define HAVE_CATANHF 1 |
+complex float catanhf (complex float z); |
+ |
+complex float |
+catanhf (complex float z) |
+{ |
+ return clogf ((1.0f+z)/(1.0f-z))/2.0f; |
+} |
+#endif |
+ |
+ |
+#if !defined(HAVE_CATANH) && defined(HAVE_CLOG) |
+#define HAVE_CATANH 1 |
+complex double catanh (complex double z); |
+ |
+complex double |
+catanh (complex double z) |
+{ |
+ return clog ((1.0+z)/(1.0-z))/2.0; |
+} |
+#endif |
+ |
+#if !defined(HAVE_CATANHL) && defined(HAVE_CLOGL) |
+#define HAVE_CATANHL 1 |
+complex long double catanhl (complex long double z); |
+ |
+complex long double |
+catanhl (complex long double z) |
+{ |
+ return clogl ((1.0L+z)/(1.0L-z))/2.0L; |
+} |
+#endif |
+ |
+ |
#if !defined(HAVE_TGAMMA) |
#define HAVE_TGAMMA 1 |
- |
-extern double tgamma (double); |
+double tgamma (double); |
/* Fallback tgamma() function. Uses the algorithm from |
http://www.netlib.org/specfun/gamma and references therein. */ |
@@ -1455,7 +1847,7 @@ tgamma (double x) |
static double eps = 0; |
if (eps == 0) |
- eps = nextafter(1., 2.) - 1.; |
+ eps = nextafter (1., 2.) - 1.; |
parity = 0; |
fact = 1; |
@@ -1468,14 +1860,14 @@ tgamma (double x) |
if (y <= 0) |
{ |
y = -x; |
- y1 = trunc(y); |
+ y1 = trunc (y); |
res = y - y1; |
if (res != 0) |
{ |
- if (y1 != trunc(y1*0.5l)*2) |
+ if (y1 != trunc (y1*0.5l)*2) |
parity = 1; |
- fact = -PI / sin(PI*res); |
+ fact = -PI / sin (PI*res); |
y = y + 1; |
} |
else |
@@ -1533,8 +1925,8 @@ tgamma (double x) |
sum = sum / ysq + c[i]; |
sum = sum/y - y + SQRTPI; |
- sum = sum + (y - 0.5) * log(y); |
- res = exp(sum); |
+ sum = sum + (y - 0.5) * log (y); |
+ res = exp (sum); |
} |
else |
return x < 0 ? xnan : xinf; |
@@ -1553,8 +1945,7 @@ tgamma (double x) |
#if !defined(HAVE_LGAMMA) |
#define HAVE_LGAMMA 1 |
- |
-extern double lgamma (double); |
+double lgamma (double); |
/* Fallback lgamma() function. Uses the algorithm from |
http://www.netlib.org/specfun/algama and references therein, |
@@ -1621,17 +2012,17 @@ lgamma (double y) |
double corr, res, xden, xm1, xm2, xm4, xnum, ysq; |
if (eps == 0) |
- eps = __builtin_nextafter(1., 2.) - 1.; |
+ eps = __builtin_nextafter (1., 2.) - 1.; |
if ((y > 0) && (y <= xbig)) |
{ |
if (y <= eps) |
- res = -log(y); |
+ res = -log (y); |
else if (y <= 1.5) |
{ |
if (y < PNT68) |
{ |
- corr = -log(y); |
+ corr = -log (y); |
xm1 = y; |
} |
else |
@@ -1699,7 +2090,7 @@ lgamma (double y) |
res = res / ysq + c[i]; |
} |
res = res/y; |
- corr = log(y); |
+ corr = log (y); |
res = res + SQRTPI - 0.5*corr; |
res = res + y*(corr-1); |
} |
@@ -1724,7 +2115,7 @@ lgamma (double y) |
#if defined(HAVE_TGAMMA) && !defined(HAVE_TGAMMAF) |
#define HAVE_TGAMMAF 1 |
-extern float tgammaf (float); |
+float tgammaf (float); |
float |
tgammaf (float x) |
@@ -1735,7 +2126,7 @@ tgammaf (float x) |
#if defined(HAVE_LGAMMA) && !defined(HAVE_LGAMMAF) |
#define HAVE_LGAMMAF 1 |
-extern float lgammaf (float); |
+float lgammaf (float); |
float |
lgammaf (float x) |