complex: add C11 CMPLX macros and replace cpack with them
authorSzabolcs Nagy <nsz@port70.net>
Tue, 13 Nov 2012 00:31:49 +0000 (01:31 +0100)
committerSzabolcs Nagy <nsz@port70.net>
Tue, 13 Nov 2012 00:31:49 +0000 (01:31 +0100)
47 files changed:
include/complex.h
src/complex/__cexp.c
src/complex/__cexpf.c
src/complex/cacos.c
src/complex/cacosf.c
src/complex/cacosh.c
src/complex/cacoshf.c
src/complex/cacoshl.c
src/complex/cacosl.c
src/complex/casin.c
src/complex/casinf.c
src/complex/casinh.c
src/complex/casinhf.c
src/complex/casinhl.c
src/complex/casinl.c
src/complex/catanh.c
src/complex/catanhf.c
src/complex/catanhl.c
src/complex/ccos.c
src/complex/ccosf.c
src/complex/ccosh.c
src/complex/ccoshf.c
src/complex/ccosl.c
src/complex/cexp.c
src/complex/cexpf.c
src/complex/clog.c
src/complex/clogf.c
src/complex/clogl.c
src/complex/conj.c
src/complex/conjf.c
src/complex/conjl.c
src/complex/cproj.c
src/complex/cprojf.c
src/complex/cprojl.c
src/complex/csin.c
src/complex/csinf.c
src/complex/csinh.c
src/complex/csinhf.c
src/complex/csinl.c
src/complex/csqrt.c
src/complex/csqrtf.c
src/complex/ctan.c
src/complex/ctanf.c
src/complex/ctanh.c
src/complex/ctanhf.c
src/complex/ctanl.c
src/internal/libm.h

index b4bcb22efc818d05a294bf86e7bb178ea986dbb8..8206e02679acc6d3a26fea3aedc5e1cf3dc81962 100644 (file)
@@ -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
index f603e2be4d298a739ed8be6664150b6a76a10b8f..05ac28c75c6271219bc66d3c1b27a8750161b1bd 100644 (file)
@@ -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);
 }
index 47168e8f2cb980f86afeca78ce6dba32e4ce1433..69b54045afd4a8e953e19e72e1cf7a0f902d4f89 100644 (file)
@@ -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);
 }
index 3aca0519bac47f6dd3880d642050f1c984b589be..27c356364c8c6ffe438767352195e791ed03a23f 100644 (file)
@@ -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));
 }
index 563766e7eac5791ad10b3ac991f604aa21c153f7..11852659523a4c0ea22c44ed47eaef26f4d9c1ff 100644 (file)
@@ -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));
 }
index c2dfc1baff766d49d7873d1d037e4709a92eaaf7..8c68cb01fd6039eafaa856a7f3130a425b7504f6 100644 (file)
@@ -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));
 }
index 37ff8800ebc5710c708fc2151f75a084ded3a177..ade01c0907c8322ffcfe0dc084d35f5ec37be246 100644 (file)
@@ -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));
 }
index 2a04e27b7324b3f34b6aba7d2429d6c2eab18a8a..65342557f9a545ef935190b3c64b6bdf2c6ceaa5 100644 (file)
@@ -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
index 5992e0563afef6588b233e8f10bdf54b132b7aa4..7fd4a2f6b442404b00e9ea133e0e6e90dec8b057 100644 (file)
@@ -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
index 79aff2789de96c0e8728fb0d3b6b25f9d114c800..dfdda988bafcda9403b7e03ef55f4a0eaf9349a9 100644 (file)
@@ -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));
 }
index cb9863f6c3f3f2c4cfe07c80c9b8f89dd943d537..93f0e335092b02241445a50461c70e88b6295594 100644 (file)
@@ -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));
 }
index f2b3fef83333bb38e274d97b306edc721556cdcf..b57fe8c40ba3bfe94047e8af1f17b12ff9e4dd89 100644 (file)
@@ -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));
 }
index ed4af6431f4f47d8f3c5cb5cde5ee3cc85daccc7..a11bf902d86f9cb7dff2ff5984e63d10ec441d85 100644 (file)
@@ -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));
 }
index e5d80cef8a3f19665543c822fcebdb9eaad66120..714f189359071e31c9da7e52f66cb17df35facc9 100644 (file)
@@ -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
index f9aa8ded97b37bfb0db9d8caeef46707f18fad4f..0916c60f2a6b3c7eeb71d74c4cff06a5a1273fae 100644 (file)
@@ -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
index b162802230b3de67b0c4c4b152bab3f0b3679d99..e248d9b934135c5b474d16223c520109f0ed3d71 100644 (file)
@@ -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));
 }
index e1d1e6489ed26d3f192e458b3f96e65056e267b2..4a5eb04079b9de3af8d3c814a53010fb52618828 100644 (file)
@@ -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));
 }
index 0a9374a34d415bcd2a8c3378d301d14e7aba0f79..a5dd538e44535ccc4961eadb593df3f1461a649b 100644 (file)
@@ -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
index 5754c23828e6194b796a004a1709f3d04de97342..645aec29a9dc013de43e3bb4bfed7d36d671a39b 100644 (file)
@@ -4,5 +4,5 @@
 
 double complex ccos(double complex z)
 {
-       return ccosh(cpack(-cimag(z), creal(z)));
+       return ccosh(CMPLX(-cimag(z), creal(z)));
 }
index 9b72c4f472eb9bdce3038074effeafc7ebcb7896..9a67241f1cfb47ce688b9f982d9144b764516d31 100644 (file)
@@ -2,5 +2,5 @@
 
 float complex ccosf(float complex z)
 {
-       return ccoshf(cpackf(-cimagf(z), crealf(z)));
+       return ccoshf(CMPLXF(-cimagf(z), crealf(z)));
 }
index 81f29432af21b9e1abfd909d8d9a955023bf5c84..401f3c604237c046fb9f3ebf0aa9656e31ca8a31 100644 (file)
@@ -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));
 }
index 683e77faa6927dc2d639edb9d35fcb8a8d972c8d..90acfe05829f3b2078a5e4af7b45ec6e5ca5bebd 100644 (file)
@@ -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));
 }
index e37825a96c1961e0cb0259cbeefc51197f0d7d95..d787047fec8d5a8df1234f393cd2b8f1a683092b 100644 (file)
@@ -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
index 3b8bb7527bf67886900686323a0262aa4a30e77f..5118e00ea5b74d37b0721d5a3c35169c8e39cc07 100644 (file)
@@ -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));
        }
 }
index 0cf13a3d7699aba533d3d0abce133299090ed772..1a09964cbb52df1cc68b857e459450cf6d98910d 100644 (file)
@@ -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));
        }
 }
index 6f10a115bee6b0c2d644f9ec42f080dfb8f99d08..12aae9c7e9a02e32f7c68a9a6f98e1218455cca8 100644 (file)
@@ -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);
 }
index f3aec54d1e11cea9e4783a3194eed908231fbb88..e9b32e6087bf284e972d3f0ce8377e0f0bfc131f 100644 (file)
@@ -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);
 }
index 5b84ba59b3e777599c74e075a8ce2130073e64b3..18f16088d7a31082feb0ff51c6453e2ea1f8d64a 100644 (file)
@@ -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
index 4aceea7b848e46d850b64838eee1f63986772fc9..0b3f5f46306c78086e026c7d61a0f7b8390dea4e 100644 (file)
@@ -2,5 +2,5 @@
 
 double complex conj(double complex z)
 {
-       return cpack(creal(z), -cimag(z));
+       return CMPLX(creal(z), -cimag(z));
 }
index 3155680037940b0d4bae474b67e1e32adc3c065d..9af6b2c3b4549e5233c5f502fa26037cf1bd952b 100644 (file)
@@ -2,5 +2,5 @@
 
 float complex conjf(float complex z)
 {
-       return cpackf(crealf(z), -cimagf(z));
+       return CMPLXF(crealf(z), -cimagf(z));
 }
index 01332262ec46f69586d055e169d3e67d375e7382..67f11b9dde8ee8a3622cce946941ad57bc0cc3b0 100644 (file)
@@ -2,5 +2,5 @@
 
 long double complex conjl(long double complex z)
 {
-       return cpackl(creall(z), -cimagl(z));
+       return CMPLXL(creall(z), -cimagl(z));
 }
index 1cf9bb949af6ae88e67642d71cc7ff741476f943..15f358a14f045c0dd600a3c654b058c4c212326c 100644 (file)
@@ -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;
 }
index 71129743cf839b3211e8e7852173bc5f676ef493..653be5e87cfcbf2d64f297fe21bed06423aab9e3 100644 (file)
@@ -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;
 }
index 72e50cf5ff14e1456157d4fc4d63d2e83606f651..6731aaa2aaaebd74cb8bc22a17f729841e436ad7 100644 (file)
@@ -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
index 246a4595423af74e21e1125a552f3f6e85784abe..ad8ae67ad99a59983cd00b6fbd5fe83b2071e667 100644 (file)
@@ -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));
 }
index 3aabe8f811dd2f7e82818ca28704d233ad7204e4..60b3cbaa8681ad3d5f31e40d4a86db764a053227 100644 (file)
@@ -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));
 }
index fe16f06b1e48dd8b7abd4da78777297e38193636..0f8035d1ca41f3fc864881eb5ee0b9be36410347 100644 (file)
@@ -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));
 }
index bbb116c2b546bab1badcc928c301b600c98546f9..49697f02f4a35359bce63973f8b446adee6138fb 100644 (file)
@@ -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));
 }
index 4ad8674533f33366c836ace2bb0ba895038a0822..4e9f86c3ae4dc2094dd55dd79bd88a25ce40d784 100644 (file)
@@ -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
index 21fb879d8f836bbc6e2ed4e528228f5228fb1205..8a2ba608012230d79a16ce788feb96e4b4d53a0f 100644 (file)
@@ -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. */
index 16487c23575d999d32aa26d0f9f9e99e8f7933fb..ab5102f035b9edc7889ffe3ff24d3b18ffcec50b 100644 (file)
@@ -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));
        }
 }
index 4741a4df3f8966090a311c3155ce3fa804bcc292..c09263744b869b92e03fc5c956a18178b089d655 100644 (file)
@@ -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));
 }
index 9bbeb0513247af45a7ccd82f41a43872b1498e06..009b1921ba35699471628e8cd3dcfa4b76adcfbc 100644 (file)
@@ -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));
 }
index dd569fc365314f093caef5fa69fdf1a38fc1fc72..0461050d73301adfad8e5571316d96b07556449a 100644 (file)
@@ -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);
 }
index 7d746134b6d639fe9c418de48e5440fdef8ff62e..a7e1a5fc0dccfdb8adeaf17b40794ebddf7c42a0 100644 (file)
@@ -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);
 }
index 4b4c99b69b511c0d46c0e379ead735f66e89f40b..ac1c3e0ad86d7611b8a9a74ed68a99abbffdbc21 100644 (file)
@@ -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
index a71c4c05ab092b77bfd2c24e8a6eaab569745bea..dfecd83680647db220f8aeb8d8518d46e9c9664d 100644 (file)
@@ -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