add creal/cimag macros in complex.h (and use them in the functions defs)
authorRich Felker <dalias@aerifal.cx>
Thu, 22 Mar 2012 19:54:55 +0000 (15:54 -0400)
committerRich Felker <dalias@aerifal.cx>
Thu, 22 Mar 2012 19:54:55 +0000 (15:54 -0400)
include/complex.h
src/complex/cimag.c
src/complex/cimagf.c
src/complex/cimagl.c
src/complex/creal.c
src/complex/crealf.c
src/complex/creall.c
src/internal/libm.h

index 8ee70575cbb0761f42db9900e36f284aff570945..90496bd5d397737ecc1f6f87d416a8371e49225c 100644 (file)
@@ -97,6 +97,17 @@ double creal(double complex);
 float crealf(float complex);
 long double creall(long double complex);
 
+#define __CREALIMAG(x, t, i) \
+       ((union { _Complex t __z; t __xy[2]; }){(_Complex t)(x)}.__xy[i])
+
+#define creal(x) __CREALIMAG(x, double, 0)
+#define crealf(x) __CREALIMAG(x, float, 0)
+#define creall(x) __CREALIMAG(x, long double, 0)
+
+#define cimag(x) __CREALIMAG(x, double, 1)
+#define cimagf(x) __CREALIMAG(x, float, 1)
+#define cimagl(x) __CREALIMAG(x, long double, 1)
+
 #ifdef __cplusplus
 }
 #endif
index 5e1ad46b3b2f4a2320e9ffa1eadfd54d64ea1027..00955641b14a929373a55f9f3f30839d587f3d20 100644 (file)
@@ -2,6 +2,5 @@
 
 double (cimag)(double complex z)
 {
-       union dcomplex u = {z};
-       return u.a[1];
+       return cimag(z);
 }
index 99fffc585fb838024d754e0ca87d5f61ec46901b..f7bcd76e439fe0f81a45896f5814ce0fe8b79e75 100644 (file)
@@ -2,6 +2,5 @@
 
 float (cimagf)(float complex z)
 {
-       union fcomplex u = {z};
-       return u.a[1];
+       return cimagf(z);
 }
index d9a0780caee2ff2d21661382cc9e9af479340285..9ec24eeeafc56d93bddaead909538ff896c59908 100644 (file)
@@ -2,6 +2,5 @@
 
 long double (cimagl)(long double complex z)
 {
-       union lcomplex u = {z};
-       return u.a[1];
+       return cimagl(z);
 }
index 2bb91812dac9fb779d243f4fde615c50ed3bf718..f6703040d06fddbfe8fd27b347f4ad0e9531e2dd 100644 (file)
@@ -1,6 +1,6 @@
 #include <complex.h>
 
-double creal(double complex z)
+double (creal)(double complex z)
 {
-       return z;
+       return creal(z);
 }
index 078232f0b65caef46a42c8f90411b0b325e1282c..5dc3ff1d3099ddb7dab0ff3dca2e39a9ebf01d65 100644 (file)
@@ -1,6 +1,6 @@
 #include <complex.h>
 
-float crealf(float complex z)
+float (crealf)(float complex z)
 {
-       return z;
+       return crealf(z);
 }
index 56e640973311aed4e60b4fe02c9e31281719e9d6..fd9dc3470c2535b195a073a63a989b0ea972b8d6 100644 (file)
@@ -1,6 +1,6 @@
 #include <complex.h>
 
-long double creall(long double complex z)
+long double (creall)(long double complex z)
 {
-       return z;
+       return creall(z);
 }
index 67c42b981c0163ce160975074aa9de5d5a9c7d06..8c5474a8483091e4d5582722b9e0916755845227 100644 (file)
@@ -173,14 +173,6 @@ union lcomplex {
        long double a[2];
 };
 
-// FIXME: move to complex.h ?
-#define creal(z) ((double)(z))
-#define crealf(z) ((float)(z))
-#define creall(z) ((long double)(z))
-#define cimag(z) ((union dcomplex){(z)}.a[1])
-#define cimagf(z) ((union fcomplex){(z)}.a[1])
-#define cimagl(z) ((union lcomplex){(z)}.a[1])
-
 /* 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)