diff options
author | Szabolcs Nagy <nsz@port70.net> | 2012-11-13 01:31:49 +0100 |
---|---|---|
committer | Szabolcs Nagy <nsz@port70.net> | 2012-11-13 01:31:49 +0100 |
commit | cfbaba79a2dd380e580a247b8fd36af60c878e8f (patch) | |
tree | a002987af1ea7652985973f8db98d2d4f8b6064a | |
parent | e2fe959fe2a450f74271d4d3c4b0d9456f889125 (diff) | |
download | musl-cfbaba79a2dd380e580a247b8fd36af60c878e8f.tar.gz musl-cfbaba79a2dd380e580a247b8fd36af60c878e8f.tar.xz musl-cfbaba79a2dd380e580a247b8fd36af60c878e8f.zip |
complex: add C11 CMPLX macros and replace cpack with them
47 files changed, 152 insertions, 156 deletions
diff --git a/include/complex.h b/include/complex.h index b4bcb22e..8206e026 100644 --- a/include/complex.h +++ b/include/complex.h @@ -112,6 +112,15 @@ long double creall(long double complex); #define cimagf(x) __CIMAG(x, float) #define cimagl(x) __CIMAG(x, long double) +#define __CMPLX(x, y, t) \ + ((union { _Complex t __z; t __xy[2]; }){.__xy = {(x),(y)}}.__z) + +#if __STDC_VERSION__ >= 201112L +#define CMPLX(x, y) __CMPLX(x, y, double) +#define CMPLXF(x, y) __CMPLX(x, y, float) +#define CMPLXL(x, y) __CMPLX(x, y, long double) +#endif + #ifdef __cplusplus } #endif diff --git a/src/complex/__cexp.c b/src/complex/__cexp.c index f603e2be..05ac28c7 100644 --- a/src/complex/__cexp.c +++ b/src/complex/__cexp.c @@ -83,5 +83,5 @@ double complex __ldexp_cexp(double complex z, int expt) half_expt = expt - half_expt; INSERT_WORDS(scale2, (0x3ff + half_expt) << 20, 0); - return cpack(cos(y) * exp_x * scale1 * scale2, sin(y) * exp_x * scale1 * scale2); + return CMPLX(cos(y) * exp_x * scale1 * scale2, sin(y) * exp_x * scale1 * scale2); } diff --git a/src/complex/__cexpf.c b/src/complex/__cexpf.c index 47168e8f..69b54045 100644 --- a/src/complex/__cexpf.c +++ b/src/complex/__cexpf.c @@ -63,6 +63,6 @@ float complex __ldexp_cexpf(float complex z, int expt) half_expt = expt - half_expt; SET_FLOAT_WORD(scale2, (0x7f + half_expt) << 23); - return cpackf(cosf(y) * exp_x * scale1 * scale2, + return CMPLXF(cosf(y) * exp_x * scale1 * scale2, sinf(y) * exp_x * scale1 * scale2); } diff --git a/src/complex/cacos.c b/src/complex/cacos.c index 3aca0519..27c35636 100644 --- a/src/complex/cacos.c +++ b/src/complex/cacos.c @@ -7,5 +7,5 @@ double complex cacos(double complex z) { z = casin(z); - return cpack(M_PI_2 - creal(z), -cimag(z)); + return CMPLX(M_PI_2 - creal(z), -cimag(z)); } diff --git a/src/complex/cacosf.c b/src/complex/cacosf.c index 563766e7..11852659 100644 --- a/src/complex/cacosf.c +++ b/src/complex/cacosf.c @@ -5,5 +5,5 @@ float complex cacosf(float complex z) { z = casinf(z); - return cpackf((float)M_PI_2 - crealf(z), -cimagf(z)); + return CMPLXF((float)M_PI_2 - crealf(z), -cimagf(z)); } diff --git a/src/complex/cacosh.c b/src/complex/cacosh.c index c2dfc1ba..8c68cb01 100644 --- a/src/complex/cacosh.c +++ b/src/complex/cacosh.c @@ -5,5 +5,5 @@ double complex cacosh(double complex z) { z = cacos(z); - return cpack(-cimag(z), creal(z)); + return CMPLX(-cimag(z), creal(z)); } diff --git a/src/complex/cacoshf.c b/src/complex/cacoshf.c index 37ff8800..ade01c09 100644 --- a/src/complex/cacoshf.c +++ b/src/complex/cacoshf.c @@ -3,5 +3,5 @@ float complex cacoshf(float complex z) { z = cacosf(z); - return cpackf(-cimagf(z), crealf(z)); + return CMPLXF(-cimagf(z), crealf(z)); } diff --git a/src/complex/cacoshl.c b/src/complex/cacoshl.c index 2a04e27b..65342557 100644 --- a/src/complex/cacoshl.c +++ b/src/complex/cacoshl.c @@ -9,6 +9,6 @@ long double complex cacoshl(long double complex z) long double complex cacoshl(long double complex z) { z = cacosl(z); - return cpackl(-cimagl(z), creall(z)); + return CMPLXL(-cimagl(z), creall(z)); } #endif diff --git a/src/complex/cacosl.c b/src/complex/cacosl.c index 5992e056..7fd4a2f6 100644 --- a/src/complex/cacosl.c +++ b/src/complex/cacosl.c @@ -11,6 +11,6 @@ long double complex cacosl(long double complex z) long double complex cacosl(long double complex z) { z = casinl(z); - return cpackl(PI_2 - creall(z), -cimagl(z)); + return CMPLXL(PI_2 - creall(z), -cimagl(z)); } #endif diff --git a/src/complex/casin.c b/src/complex/casin.c index 79aff278..dfdda988 100644 --- a/src/complex/casin.c +++ b/src/complex/casin.c @@ -11,6 +11,6 @@ double complex casin(double complex z) x = creal(z); y = cimag(z); - w = cpack(1.0 - (x - y)*(x + y), -2.0*x*y); - return clog(cpack(-y, x) + csqrt(w)); + w = CMPLX(1.0 - (x - y)*(x + y), -2.0*x*y); + return clog(CMPLX(-y, x) + csqrt(w)); } diff --git a/src/complex/casinf.c b/src/complex/casinf.c index cb9863f6..93f0e335 100644 --- a/src/complex/casinf.c +++ b/src/complex/casinf.c @@ -9,6 +9,6 @@ float complex casinf(float complex z) x = crealf(z); y = cimagf(z); - w = cpackf(1.0 - (x - y)*(x + y), -2.0*x*y); - return clogf(cpackf(-y, x) + csqrtf(w)); + w = CMPLXF(1.0 - (x - y)*(x + y), -2.0*x*y); + return clogf(CMPLXF(-y, x) + csqrtf(w)); } diff --git a/src/complex/casinh.c b/src/complex/casinh.c index f2b3fef8..b57fe8c4 100644 --- a/src/complex/casinh.c +++ b/src/complex/casinh.c @@ -4,6 +4,6 @@ double complex casinh(double complex z) { - z = casin(cpack(-cimag(z), creal(z))); - return cpack(cimag(z), -creal(z)); + z = casin(CMPLX(-cimag(z), creal(z))); + return CMPLX(cimag(z), -creal(z)); } diff --git a/src/complex/casinhf.c b/src/complex/casinhf.c index ed4af643..a11bf902 100644 --- a/src/complex/casinhf.c +++ b/src/complex/casinhf.c @@ -2,6 +2,6 @@ float complex casinhf(float complex z) { - z = casinf(cpackf(-cimagf(z), crealf(z))); - return cpackf(cimagf(z), -crealf(z)); + z = casinf(CMPLXF(-cimagf(z), crealf(z))); + return CMPLXF(cimagf(z), -crealf(z)); } diff --git a/src/complex/casinhl.c b/src/complex/casinhl.c index e5d80cef..714f1893 100644 --- a/src/complex/casinhl.c +++ b/src/complex/casinhl.c @@ -8,7 +8,7 @@ long double complex casinhl(long double complex z) #else long double complex casinhl(long double complex z) { - z = casinl(cpackl(-cimagl(z), creall(z))); - return cpackl(cimagl(z), -creall(z)); + z = casinl(CMPLXL(-cimagl(z), creall(z))); + return CMPLXL(cimagl(z), -creall(z)); } #endif diff --git a/src/complex/casinl.c b/src/complex/casinl.c index f9aa8ded..0916c60f 100644 --- a/src/complex/casinl.c +++ b/src/complex/casinl.c @@ -14,7 +14,7 @@ long double complex casinl(long double complex z) x = creall(z); y = cimagl(z); - w = cpackl(1.0 - (x - y)*(x + y), -2.0*x*y); - return clogl(cpackl(-y, x) + csqrtl(w)); + w = CMPLXL(1.0 - (x - y)*(x + y), -2.0*x*y); + return clogl(CMPLXL(-y, x) + csqrtl(w)); } #endif diff --git a/src/complex/catanh.c b/src/complex/catanh.c index b1628022..e248d9b9 100644 --- a/src/complex/catanh.c +++ b/src/complex/catanh.c @@ -4,6 +4,6 @@ double complex catanh(double complex z) { - z = catan(cpack(-cimag(z), creal(z))); - return cpack(cimag(z), -creal(z)); + z = catan(CMPLX(-cimag(z), creal(z))); + return CMPLX(cimag(z), -creal(z)); } diff --git a/src/complex/catanhf.c b/src/complex/catanhf.c index e1d1e648..4a5eb040 100644 --- a/src/complex/catanhf.c +++ b/src/complex/catanhf.c @@ -2,6 +2,6 @@ float complex catanhf(float complex z) { - z = catanf(cpackf(-cimagf(z), crealf(z))); - return cpackf(cimagf(z), -crealf(z)); + z = catanf(CMPLXF(-cimagf(z), crealf(z))); + return CMPLXF(cimagf(z), -crealf(z)); } diff --git a/src/complex/catanhl.c b/src/complex/catanhl.c index 0a9374a3..a5dd538e 100644 --- a/src/complex/catanhl.c +++ b/src/complex/catanhl.c @@ -8,7 +8,7 @@ long double complex catanhl(long double complex z) #else long double complex catanhl(long double complex z) { - z = catanl(cpackl(-cimagl(z), creall(z))); - return cpackl(cimagl(z), -creall(z)); + z = catanl(CMPLXL(-cimagl(z), creall(z))); + return CMPLXL(cimagl(z), -creall(z)); } #endif diff --git a/src/complex/ccos.c b/src/complex/ccos.c index 5754c238..645aec29 100644 --- a/src/complex/ccos.c +++ b/src/complex/ccos.c @@ -4,5 +4,5 @@ double complex ccos(double complex z) { - return ccosh(cpack(-cimag(z), creal(z))); + return ccosh(CMPLX(-cimag(z), creal(z))); } diff --git a/src/complex/ccosf.c b/src/complex/ccosf.c index 9b72c4f4..9a67241f 100644 --- a/src/complex/ccosf.c +++ b/src/complex/ccosf.c @@ -2,5 +2,5 @@ float complex ccosf(float complex z) { - return ccoshf(cpackf(-cimagf(z), crealf(z))); + return ccoshf(CMPLXF(-cimagf(z), crealf(z))); } diff --git a/src/complex/ccosh.c b/src/complex/ccosh.c index 81f29432..401f3c60 100644 --- a/src/complex/ccosh.c +++ b/src/complex/ccosh.c @@ -55,23 +55,23 @@ double complex ccosh(double complex z) /* Handle the nearly-non-exceptional cases where x and y are finite. */ if (ix < 0x7ff00000 && iy < 0x7ff00000) { if ((iy | ly) == 0) - return cpack(cosh(x), x * y); + return CMPLX(cosh(x), x * y); if (ix < 0x40360000) /* small x: normal case */ - return cpack(cosh(x) * cos(y), sinh(x) * sin(y)); + return CMPLX(cosh(x) * cos(y), sinh(x) * sin(y)); /* |x| >= 22, so cosh(x) ~= exp(|x|) */ if (ix < 0x40862e42) { /* x < 710: exp(|x|) won't overflow */ h = exp(fabs(x)) * 0.5; - return cpack(h * cos(y), copysign(h, x) * sin(y)); + return CMPLX(h * cos(y), copysign(h, x) * sin(y)); } else if (ix < 0x4096bbaa) { /* x < 1455: scale to avoid overflow */ - z = __ldexp_cexp(cpack(fabs(x), y), -1); - return cpack(creal(z), cimag(z) * copysign(1, x)); + z = __ldexp_cexp(CMPLX(fabs(x), y), -1); + return CMPLX(creal(z), cimag(z) * copysign(1, x)); } else { /* x >= 1455: the result always overflows */ h = huge * x; - return cpack(h * h * cos(y), h * sin(y)); + return CMPLX(h * h * cos(y), h * sin(y)); } } @@ -85,7 +85,7 @@ double complex ccosh(double complex z) * the same as d(NaN). */ if ((ix | lx) == 0 && iy >= 0x7ff00000) - return cpack(y - y, copysign(0, x * (y - y))); + return CMPLX(y - y, copysign(0, x * (y - y))); /* * cosh(+-Inf +- I 0) = +Inf + I (+-)(+-)0. @@ -95,8 +95,8 @@ double complex ccosh(double complex z) */ if ((iy | ly) == 0 && ix >= 0x7ff00000) { if (((hx & 0xfffff) | lx) == 0) - return cpack(x * x, copysign(0, x) * y); - return cpack(x * x, copysign(0, (x + x) * y)); + return CMPLX(x * x, copysign(0, x) * y); + return CMPLX(x * x, copysign(0, (x + x) * y)); } /* @@ -108,7 +108,7 @@ double complex ccosh(double complex z) * nonzero x. Choice = don't raise (except for signaling NaNs). */ if (ix < 0x7ff00000 && iy >= 0x7ff00000) - return cpack(y - y, x * (y - y)); + return CMPLX(y - y, x * (y - y)); /* * cosh(+-Inf + I NaN) = +Inf + I d(NaN). @@ -121,8 +121,8 @@ double complex ccosh(double complex z) */ if (ix >= 0x7ff00000 && ((hx & 0xfffff) | lx) == 0) { if (iy >= 0x7ff00000) - return cpack(x * x, x * (y - y)); - return cpack((x * x) * cos(y), x * sin(y)); + return CMPLX(x * x, x * (y - y)); + return CMPLX((x * x) * cos(y), x * sin(y)); } /* @@ -136,5 +136,5 @@ double complex ccosh(double complex z) * Optionally raises the invalid floating-point exception for finite * nonzero y. Choice = don't raise (except for signaling NaNs). */ - return cpack((x * x) * (y - y), (x + x) * (y - y)); + return CMPLX((x * x) * (y - y), (x + x) * (y - y)); } diff --git a/src/complex/ccoshf.c b/src/complex/ccoshf.c index 683e77fa..90acfe05 100644 --- a/src/complex/ccoshf.c +++ b/src/complex/ccoshf.c @@ -48,43 +48,43 @@ float complex ccoshf(float complex z) if (ix < 0x7f800000 && iy < 0x7f800000) { if (iy == 0) - return cpackf(coshf(x), x * y); + return CMPLXF(coshf(x), x * y); if (ix < 0x41100000) /* small x: normal case */ - return cpackf(coshf(x) * cosf(y), sinhf(x) * sinf(y)); + return CMPLXF(coshf(x) * cosf(y), sinhf(x) * sinf(y)); /* |x| >= 9, so cosh(x) ~= exp(|x|) */ if (ix < 0x42b17218) { /* x < 88.7: expf(|x|) won't overflow */ h = expf(fabsf(x)) * 0.5f; - return cpackf(h * cosf(y), copysignf(h, x) * sinf(y)); + return CMPLXF(h * cosf(y), copysignf(h, x) * sinf(y)); } else if (ix < 0x4340b1e7) { /* x < 192.7: scale to avoid overflow */ - z = __ldexp_cexpf(cpackf(fabsf(x), y), -1); - return cpackf(crealf(z), cimagf(z) * copysignf(1, x)); + z = __ldexp_cexpf(CMPLXF(fabsf(x), y), -1); + return CMPLXF(crealf(z), cimagf(z) * copysignf(1, x)); } else { /* x >= 192.7: the result always overflows */ h = huge * x; - return cpackf(h * h * cosf(y), h * sinf(y)); + return CMPLXF(h * h * cosf(y), h * sinf(y)); } } if (ix == 0 && iy >= 0x7f800000) - return cpackf(y - y, copysignf(0, x * (y - y))); + return CMPLXF(y - y, copysignf(0, x * (y - y))); if (iy == 0 && ix >= 0x7f800000) { if ((hx & 0x7fffff) == 0) - return cpackf(x * x, copysignf(0, x) * y); - return cpackf(x * x, copysignf(0, (x + x) * y)); + return CMPLXF(x * x, copysignf(0, x) * y); + return CMPLXF(x * x, copysignf(0, (x + x) * y)); } if (ix < 0x7f800000 && iy >= 0x7f800000) - return cpackf(y - y, x * (y - y)); + return CMPLXF(y - y, x * (y - y)); if (ix >= 0x7f800000 && (hx & 0x7fffff) == 0) { if (iy >= 0x7f800000) - return cpackf(x * x, x * (y - y)); - return cpackf((x * x) * cosf(y), x * sinf(y)); + return CMPLXF(x * x, x * (y - y)); + return CMPLXF((x * x) * cosf(y), x * sinf(y)); } - return cpackf((x * x) * (y - y), (x + x) * (y - y)); + return CMPLXF((x * x) * (y - y), (x + x) * (y - y)); } diff --git a/src/complex/ccosl.c b/src/complex/ccosl.c index e37825a9..d787047f 100644 --- a/src/complex/ccosl.c +++ b/src/complex/ccosl.c @@ -8,6 +8,6 @@ long double complex ccosl(long double complex z) #else long double complex ccosl(long double complex z) { - return ccoshl(cpackl(-cimagl(z), creall(z))); + return ccoshl(CMPLXL(-cimagl(z), creall(z))); } #endif diff --git a/src/complex/cexp.c b/src/complex/cexp.c index 3b8bb752..5118e00e 100644 --- a/src/complex/cexp.c +++ b/src/complex/cexp.c @@ -44,22 +44,22 @@ double complex cexp(double complex z) /* cexp(x + I 0) = exp(x) + I 0 */ if ((hy | ly) == 0) - return cpack(exp(x), y); + return CMPLX(exp(x), y); EXTRACT_WORDS(hx, lx, x); /* cexp(0 + I y) = cos(y) + I sin(y) */ if (((hx & 0x7fffffff) | lx) == 0) - return cpack(cos(y), sin(y)); + return CMPLX(cos(y), sin(y)); if (hy >= 0x7ff00000) { if (lx != 0 || (hx & 0x7fffffff) != 0x7ff00000) { /* cexp(finite|NaN +- I Inf|NaN) = NaN + I NaN */ - return cpack(y - y, y - y); + return CMPLX(y - y, y - y); } else if (hx & 0x80000000) { /* cexp(-Inf +- I Inf|NaN) = 0 + I 0 */ - return cpack(0.0, 0.0); + return CMPLX(0.0, 0.0); } else { /* cexp(+Inf +- I Inf|NaN) = Inf + I NaN */ - return cpack(x, y - y); + return CMPLX(x, y - y); } } @@ -78,6 +78,6 @@ double complex cexp(double complex z) * - x = NaN (spurious inexact exception from y) */ exp_x = exp(x); - return cpack(exp_x * cos(y), exp_x * sin(y)); + return CMPLX(exp_x * cos(y), exp_x * sin(y)); } } diff --git a/src/complex/cexpf.c b/src/complex/cexpf.c index 0cf13a3d..1a09964c 100644 --- a/src/complex/cexpf.c +++ b/src/complex/cexpf.c @@ -44,22 +44,22 @@ float complex cexpf(float complex z) /* cexp(x + I 0) = exp(x) + I 0 */ if (hy == 0) - return cpackf(expf(x), y); + return CMPLXF(expf(x), y); GET_FLOAT_WORD(hx, x); /* cexp(0 + I y) = cos(y) + I sin(y) */ if ((hx & 0x7fffffff) == 0) - return cpackf(cosf(y), sinf(y)); + return CMPLXF(cosf(y), sinf(y)); if (hy >= 0x7f800000) { if ((hx & 0x7fffffff) != 0x7f800000) { /* cexp(finite|NaN +- I Inf|NaN) = NaN + I NaN */ - return cpackf(y - y, y - y); + return CMPLXF(y - y, y - y); } else if (hx & 0x80000000) { /* cexp(-Inf +- I Inf|NaN) = 0 + I 0 */ - return cpackf(0.0, 0.0); + return CMPLXF(0.0, 0.0); } else { /* cexp(+Inf +- I Inf|NaN) = Inf + I NaN */ - return cpackf(x, y - y); + return CMPLXF(x, y - y); } } @@ -78,6 +78,6 @@ float complex cexpf(float complex z) * - x = NaN (spurious inexact exception from y) */ exp_x = expf(x); - return cpackf(exp_x * cosf(y), exp_x * sinf(y)); + return CMPLXF(exp_x * cosf(y), exp_x * sinf(y)); } } diff --git a/src/complex/clog.c b/src/complex/clog.c index 6f10a115..12aae9c7 100644 --- a/src/complex/clog.c +++ b/src/complex/clog.c @@ -10,5 +10,5 @@ double complex clog(double complex z) r = cabs(z); phi = carg(z); - return cpack(log(r), phi); + return CMPLX(log(r), phi); } diff --git a/src/complex/clogf.c b/src/complex/clogf.c index f3aec54d..e9b32e60 100644 --- a/src/complex/clogf.c +++ b/src/complex/clogf.c @@ -8,5 +8,5 @@ float complex clogf(float complex z) r = cabsf(z); phi = cargf(z); - return cpackf(logf(r), phi); + return CMPLXF(logf(r), phi); } diff --git a/src/complex/clogl.c b/src/complex/clogl.c index 5b84ba59..18f16088 100644 --- a/src/complex/clogl.c +++ b/src/complex/clogl.c @@ -13,6 +13,6 @@ long double complex clogl(long double complex z) r = cabsl(z); phi = cargl(z); - return cpackl(logl(r), phi); + return CMPLXL(logl(r), phi); } #endif diff --git a/src/complex/conj.c b/src/complex/conj.c index 4aceea7b..0b3f5f46 100644 --- a/src/complex/conj.c +++ b/src/complex/conj.c @@ -2,5 +2,5 @@ double complex conj(double complex z) { - return cpack(creal(z), -cimag(z)); + return CMPLX(creal(z), -cimag(z)); } diff --git a/src/complex/conjf.c b/src/complex/conjf.c index 31556800..9af6b2c3 100644 --- a/src/complex/conjf.c +++ b/src/complex/conjf.c @@ -2,5 +2,5 @@ float complex conjf(float complex z) { - return cpackf(crealf(z), -cimagf(z)); + return CMPLXF(crealf(z), -cimagf(z)); } diff --git a/src/complex/conjl.c b/src/complex/conjl.c index 01332262..67f11b9d 100644 --- a/src/complex/conjl.c +++ b/src/complex/conjl.c @@ -2,5 +2,5 @@ long double complex conjl(long double complex z) { - return cpackl(creall(z), -cimagl(z)); + return CMPLXL(creall(z), -cimagl(z)); } diff --git a/src/complex/cproj.c b/src/complex/cproj.c index 1cf9bb94..15f358a1 100644 --- a/src/complex/cproj.c +++ b/src/complex/cproj.c @@ -3,6 +3,6 @@ double complex cproj(double complex z) { if (isinf(creal(z)) || isinf(cimag(z))) - return cpack(INFINITY, copysign(0.0, creal(z))); + return CMPLX(INFINITY, copysign(0.0, creal(z))); return z; } diff --git a/src/complex/cprojf.c b/src/complex/cprojf.c index 71129743..653be5e8 100644 --- a/src/complex/cprojf.c +++ b/src/complex/cprojf.c @@ -3,6 +3,6 @@ float complex cprojf(float complex z) { if (isinf(crealf(z)) || isinf(cimagf(z))) - return cpackf(INFINITY, copysignf(0.0, crealf(z))); + return CMPLXF(INFINITY, copysignf(0.0, crealf(z))); return z; } diff --git a/src/complex/cprojl.c b/src/complex/cprojl.c index 72e50cf5..6731aaa2 100644 --- a/src/complex/cprojl.c +++ b/src/complex/cprojl.c @@ -9,7 +9,7 @@ long double complex cprojl(long double complex z) long double complex cprojl(long double complex z) { if (isinf(creall(z)) || isinf(cimagl(z))) - return cpackl(INFINITY, copysignl(0.0, creall(z))); + return CMPLXL(INFINITY, copysignl(0.0, creall(z))); return z; } #endif diff --git a/src/complex/csin.c b/src/complex/csin.c index 246a4595..ad8ae67a 100644 --- a/src/complex/csin.c +++ b/src/complex/csin.c @@ -4,6 +4,6 @@ double complex csin(double complex z) { - z = csinh(cpack(-cimag(z), creal(z))); - return cpack(cimag(z), -creal(z)); + z = csinh(CMPLX(-cimag(z), creal(z))); + return CMPLX(cimag(z), -creal(z)); } diff --git a/src/complex/csinf.c b/src/complex/csinf.c index 3aabe8f8..60b3cbaa 100644 --- a/src/complex/csinf.c +++ b/src/complex/csinf.c @@ -2,6 +2,6 @@ float complex csinf(float complex z) { - z = csinhf(cpackf(-cimagf(z), crealf(z))); - return cpackf(cimagf(z), -crealf(z)); + z = csinhf(CMPLXF(-cimagf(z), crealf(z))); + return CMPLXF(cimagf(z), -crealf(z)); } diff --git a/src/complex/csinh.c b/src/complex/csinh.c index fe16f06b..0f8035d1 100644 --- a/src/complex/csinh.c +++ b/src/complex/csinh.c @@ -55,23 +55,23 @@ double complex csinh(double complex z) /* Handle the nearly-non-exceptional cases where x and y are finite. */ if (ix < 0x7ff00000 && iy < 0x7ff00000) { if ((iy | ly) == 0) - return cpack(sinh(x), y); + return CMPLX(sinh(x), y); if (ix < 0x40360000) /* small x: normal case */ - return cpack(sinh(x) * cos(y), cosh(x) * sin(y)); + return CMPLX(sinh(x) * cos(y), cosh(x) * sin(y)); /* |x| >= 22, so cosh(x) ~= exp(|x|) */ if (ix < 0x40862e42) { /* x < 710: exp(|x|) won't overflow */ h = exp(fabs(x)) * 0.5; - return cpack(copysign(h, x) * cos(y), h * sin(y)); + return CMPLX(copysign(h, x) * cos(y), h * sin(y)); } else if (ix < 0x4096bbaa) { /* x < 1455: scale to avoid overflow */ - z = __ldexp_cexp(cpack(fabs(x), y), -1); - return cpack(creal(z) * copysign(1, x), cimag(z)); + z = __ldexp_cexp(CMPLX(fabs(x), y), -1); + return CMPLX(creal(z) * copysign(1, x), cimag(z)); } else { /* x >= 1455: the result always overflows */ h = huge * x; - return cpack(h * cos(y), h * h * sin(y)); + return CMPLX(h * cos(y), h * h * sin(y)); } } @@ -85,7 +85,7 @@ double complex csinh(double complex z) * the same as d(NaN). */ if ((ix | lx) == 0 && iy >= 0x7ff00000) - return cpack(copysign(0, x * (y - y)), y - y); + return CMPLX(copysign(0, x * (y - y)), y - y); /* * sinh(+-Inf +- I 0) = +-Inf + I +-0. @@ -94,8 +94,8 @@ double complex csinh(double complex z) */ if ((iy | ly) == 0 && ix >= 0x7ff00000) { if (((hx & 0xfffff) | lx) == 0) - return cpack(x, y); - return cpack(x, copysign(0, y)); + return CMPLX(x, y); + return CMPLX(x, copysign(0, y)); } /* @@ -107,7 +107,7 @@ double complex csinh(double complex z) * nonzero x. Choice = don't raise (except for signaling NaNs). */ if (ix < 0x7ff00000 && iy >= 0x7ff00000) - return cpack(y - y, x * (y - y)); + return CMPLX(y - y, x * (y - y)); /* * sinh(+-Inf + I NaN) = +-Inf + I d(NaN). @@ -122,8 +122,8 @@ double complex csinh(double complex z) */ if (ix >= 0x7ff00000 && ((hx & 0xfffff) | lx) == 0) { if (iy >= 0x7ff00000) - return cpack(x * x, x * (y - y)); - return cpack(x * cos(y), INFINITY * sin(y)); + return CMPLX(x * x, x * (y - y)); + return CMPLX(x * cos(y), INFINITY * sin(y)); } /* @@ -137,5 +137,5 @@ double complex csinh(double complex z) * Optionally raises the invalid floating-point exception for finite * nonzero y. Choice = don't raise (except for signaling NaNs). */ - return cpack((x * x) * (y - y), (x + x) * (y - y)); + return CMPLX((x * x) * (y - y), (x + x) * (y - y)); } diff --git a/src/complex/csinhf.c b/src/complex/csinhf.c index bbb116c2..49697f02 100644 --- a/src/complex/csinhf.c +++ b/src/complex/csinhf.c @@ -48,43 +48,43 @@ float complex csinhf(float complex z) if (ix < 0x7f800000 && iy < 0x7f800000) { if (iy == 0) - return cpackf(sinhf(x), y); + return CMPLXF(sinhf(x), y); if (ix < 0x41100000) /* small x: normal case */ - return cpackf(sinhf(x) * cosf(y), coshf(x) * sinf(y)); + return CMPLXF(sinhf(x) * cosf(y), coshf(x) * sinf(y)); /* |x| >= 9, so cosh(x) ~= exp(|x|) */ if (ix < 0x42b17218) { /* x < 88.7: expf(|x|) won't overflow */ h = expf(fabsf(x)) * 0.5f; - return cpackf(copysignf(h, x) * cosf(y), h * sinf(y)); + return CMPLXF(copysignf(h, x) * cosf(y), h * sinf(y)); } else if (ix < 0x4340b1e7) { /* x < 192.7: scale to avoid overflow */ - z = __ldexp_cexpf(cpackf(fabsf(x), y), -1); - return cpackf(crealf(z) * copysignf(1, x), cimagf(z)); + z = __ldexp_cexpf(CMPLXF(fabsf(x), y), -1); + return CMPLXF(crealf(z) * copysignf(1, x), cimagf(z)); } else { /* x >= 192.7: the result always overflows */ h = huge * x; - return cpackf(h * cosf(y), h * h * sinf(y)); + return CMPLXF(h * cosf(y), h * h * sinf(y)); } } if (ix == 0 && iy >= 0x7f800000) - return cpackf(copysignf(0, x * (y - y)), y - y); + return CMPLXF(copysignf(0, x * (y - y)), y - y); if (iy == 0 && ix >= 0x7f800000) { if ((hx & 0x7fffff) == 0) - return cpackf(x, y); - return cpackf(x, copysignf(0, y)); + return CMPLXF(x, y); + return CMPLXF(x, copysignf(0, y)); } if (ix < 0x7f800000 && iy >= 0x7f800000) - return cpackf(y - y, x * (y - y)); + return CMPLXF(y - y, x * (y - y)); if (ix >= 0x7f800000 && (hx & 0x7fffff) == 0) { if (iy >= 0x7f800000) - return cpackf(x * x, x * (y - y)); - return cpackf(x * cosf(y), INFINITY * sinf(y)); + return CMPLXF(x * x, x * (y - y)); + return CMPLXF(x * cosf(y), INFINITY * sinf(y)); } - return cpackf((x * x) * (y - y), (x + x) * (y - y)); + return CMPLXF((x * x) * (y - y), (x + x) * (y - y)); } diff --git a/src/complex/csinl.c b/src/complex/csinl.c index 4ad86745..4e9f86c3 100644 --- a/src/complex/csinl.c +++ b/src/complex/csinl.c @@ -8,7 +8,7 @@ long double complex csinl(long double complex z) #else long double complex csinl(long double complex z) { - z = csinhl(cpackl(-cimagl(z), creall(z))); - return cpackl(cimagl(z), -creall(z)); + z = csinhl(CMPLXL(-cimagl(z), creall(z))); + return CMPLXL(cimagl(z), -creall(z)); } #endif diff --git a/src/complex/csqrt.c b/src/complex/csqrt.c index 21fb879d..8a2ba608 100644 --- a/src/complex/csqrt.c +++ b/src/complex/csqrt.c @@ -51,12 +51,12 @@ double complex csqrt(double complex z) /* Handle special cases. */ if (z == 0) - return cpack(0, b); + return CMPLX(0, b); if (isinf(b)) - return cpack(INFINITY, b); + return CMPLX(INFINITY, b); if (isnan(a)) { t = (b - b) / (b - b); /* raise invalid if b is not a NaN */ - return cpack(a, t); /* return NaN + NaN i */ + return CMPLX(a, t); /* return NaN + NaN i */ } if (isinf(a)) { /* @@ -66,9 +66,9 @@ double complex csqrt(double complex z) * csqrt(-inf + y i) = 0 + inf i */ if (signbit(a)) - return cpack(fabs(b - b), copysign(a, b)); + return CMPLX(fabs(b - b), copysign(a, b)); else - return cpack(a, copysign(b - b, b)); + return CMPLX(a, copysign(b - b, b)); } /* * The remaining special case (b is NaN) is handled just fine by @@ -87,10 +87,10 @@ double complex csqrt(double complex z) /* Algorithm 312, CACM vol 10, Oct 1967. */ if (a >= 0) { t = sqrt((a + hypot(a, b)) * 0.5); - result = cpack(t, b / (2 * t)); + result = CMPLX(t, b / (2 * t)); } else { t = sqrt((-a + hypot(a, b)) * 0.5); - result = cpack(fabs(b) / (2 * t), copysign(t, b)); + result = CMPLX(fabs(b) / (2 * t), copysign(t, b)); } /* Rescale. */ diff --git a/src/complex/csqrtf.c b/src/complex/csqrtf.c index 16487c23..ab5102f0 100644 --- a/src/complex/csqrtf.c +++ b/src/complex/csqrtf.c @@ -43,12 +43,12 @@ float complex csqrtf(float complex z) /* Handle special cases. */ if (z == 0) - return cpackf(0, b); + return CMPLXF(0, b); if (isinf(b)) - return cpackf(INFINITY, b); + return CMPLXF(INFINITY, b); if (isnan(a)) { t = (b - b) / (b - b); /* raise invalid if b is not a NaN */ - return cpackf(a, t); /* return NaN + NaN i */ + return CMPLXF(a, t); /* return NaN + NaN i */ } if (isinf(a)) { /* @@ -58,9 +58,9 @@ float complex csqrtf(float complex z) * csqrtf(-inf + y i) = 0 + inf i */ if (signbit(a)) - return cpackf(fabsf(b - b), copysignf(a, b)); + return CMPLXF(fabsf(b - b), copysignf(a, b)); else - return cpackf(a, copysignf(b - b, b)); + return CMPLXF(a, copysignf(b - b, b)); } /* * The remaining special case (b is NaN) is handled just fine by @@ -74,9 +74,9 @@ float complex csqrtf(float complex z) */ if (a >= 0) { t = sqrt((a + hypot(a, b)) * 0.5); - return cpackf(t, b / (2.0 * t)); + return CMPLXF(t, b / (2.0 * t)); } else { t = sqrt((-a + hypot(a, b)) * 0.5); - return cpackf(fabsf(b) / (2.0 * t), copysignf(t, b)); + return CMPLXF(fabsf(b) / (2.0 * t), copysignf(t, b)); } } diff --git a/src/complex/ctan.c b/src/complex/ctan.c index 4741a4df..c0926374 100644 --- a/src/complex/ctan.c +++ b/src/complex/ctan.c @@ -4,6 +4,6 @@ double complex ctan(double complex z) { - z = ctanh(cpack(-cimag(z), creal(z))); - return cpack(cimag(z), -creal(z)); + z = ctanh(CMPLX(-cimag(z), creal(z))); + return CMPLX(cimag(z), -creal(z)); } diff --git a/src/complex/ctanf.c b/src/complex/ctanf.c index 9bbeb051..009b1921 100644 --- a/src/complex/ctanf.c +++ b/src/complex/ctanf.c @@ -2,6 +2,6 @@ float complex ctanf(float complex z) { - z = ctanhf(cpackf(-cimagf(z), crealf(z))); - return cpackf(cimagf(z), -crealf(z)); + z = ctanhf(CMPLXF(-cimagf(z), crealf(z))); + return CMPLXF(cimagf(z), -crealf(z)); } diff --git a/src/complex/ctanh.c b/src/complex/ctanh.c index dd569fc3..0461050d 100644 --- a/src/complex/ctanh.c +++ b/src/complex/ctanh.c @@ -95,9 +95,9 @@ double complex ctanh(double complex z) */ if (ix >= 0x7ff00000) { if ((ix & 0xfffff) | lx) /* x is NaN */ - return cpack(x, (y == 0 ? y : x * y)); + return CMPLX(x, (y == 0 ? y : x * y)); SET_HIGH_WORD(x, hx - 0x40000000); /* x = copysign(1, x) */ - return cpack(x, copysign(0, isinf(y) ? y : sin(y) * cos(y))); + return CMPLX(x, copysign(0, isinf(y) ? y : sin(y) * cos(y))); } /* @@ -105,7 +105,7 @@ double complex ctanh(double complex z) * ctanh(x +- i Inf) = NaN + i NaN */ if (!isfinite(y)) - return cpack(y - y, y - y); + return CMPLX(y - y, y - y); /* * ctanh(+-huge + i +-y) ~= +-1 +- i 2sin(2y)/exp(2x), using the @@ -114,7 +114,7 @@ double complex ctanh(double complex z) */ if (ix >= 0x40360000) { /* x >= 22 */ double exp_mx = exp(-fabs(x)); - return cpack(copysign(1, x), 4 * sin(y) * cos(y) * exp_mx * exp_mx); + return CMPLX(copysign(1, x), 4 * sin(y) * cos(y) * exp_mx * exp_mx); } /* Kahan's algorithm */ @@ -123,5 +123,5 @@ double complex ctanh(double complex z) s = sinh(x); rho = sqrt(1 + s * s); /* = cosh(x) */ denom = 1 + beta * s * s; - return cpack((beta * rho * s) / denom, t / denom); + return CMPLX((beta * rho * s) / denom, t / denom); } diff --git a/src/complex/ctanhf.c b/src/complex/ctanhf.c index 7d746134..a7e1a5fc 100644 --- a/src/complex/ctanhf.c +++ b/src/complex/ctanhf.c @@ -44,17 +44,17 @@ float complex ctanhf(float complex z) if (ix >= 0x7f800000) { if (ix & 0x7fffff) - return cpackf(x, (y == 0 ? y : x * y)); + return CMPLXF(x, (y == 0 ? y : x * y)); SET_FLOAT_WORD(x, hx - 0x40000000); - return cpackf(x, copysignf(0, isinf(y) ? y : sinf(y) * cosf(y))); + return CMPLXF(x, copysignf(0, isinf(y) ? y : sinf(y) * cosf(y))); } if (!isfinite(y)) - return cpackf(y - y, y - y); + return CMPLXF(y - y, y - y); if (ix >= 0x41300000) { /* x >= 11 */ float exp_mx = expf(-fabsf(x)); - return cpackf(copysignf(1, x), 4 * sinf(y) * cosf(y) * exp_mx * exp_mx); + return CMPLXF(copysignf(1, x), 4 * sinf(y) * cosf(y) * exp_mx * exp_mx); } t = tanf(y); @@ -62,5 +62,5 @@ float complex ctanhf(float complex z) s = sinhf(x); rho = sqrtf(1 + s * s); denom = 1 + beta * s * s; - return cpackf((beta * rho * s) / denom, t / denom); + return CMPLXF((beta * rho * s) / denom, t / denom); } diff --git a/src/complex/ctanl.c b/src/complex/ctanl.c index 4b4c99b6..ac1c3e0a 100644 --- a/src/complex/ctanl.c +++ b/src/complex/ctanl.c @@ -8,7 +8,7 @@ long double complex ctanl(long double complex z) #else long double complex ctanl(long double complex z) { - z = ctanhl(cpackl(-cimagl(z), creall(z))); - return cpackl(cimagl(z), -creall(z)); + z = ctanhl(CMPLXL(-cimagl(z), creall(z))); + return CMPLXL(cimagl(z), -creall(z)); } #endif diff --git a/src/internal/libm.h b/src/internal/libm.h index a71c4c05..dfecd836 100644 --- a/src/internal/libm.h +++ b/src/internal/libm.h @@ -170,25 +170,12 @@ long double __p1evll(long double, const long double *, int); #define STRICT_ASSIGN(type, lval, rval) ((lval) = (type)(rval)) #endif - /* complex */ -union dcomplex { - double complex z; - double a[2]; -}; -union fcomplex { - float complex z; - float a[2]; -}; -union lcomplex { - long double complex z; - long double a[2]; -}; - -/* x + y*I is not supported properly by gcc */ -#define cpack(x,y) ((union dcomplex){.a={(x),(y)}}.z) -#define cpackf(x,y) ((union fcomplex){.a={(x),(y)}}.z) -#define cpackl(x,y) ((union lcomplex){.a={(x),(y)}}.z) +#ifndef CMPLX +#define CMPLX(x, y) __CMPLX(x, y, double) +#define CMPLXF(x, y) __CMPLX(x, y, float) +#define CMPLXL(x, y) __CMPLX(x, y, long double) +#endif #endif |