add creal/cimag macros in complex.h (and use them in the functions defs)

This commit is contained in:
Rich Felker 2012-03-22 15:54:55 -04:00
parent 132f0a0083
commit 13e400b355
8 changed files with 20 additions and 20 deletions

View File

@ -97,6 +97,17 @@ double creal(double complex);
float crealf(float complex); float crealf(float complex);
long double creall(long double 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 #ifdef __cplusplus
} }
#endif #endif

View File

@ -2,6 +2,5 @@
double (cimag)(double complex z) double (cimag)(double complex z)
{ {
union dcomplex u = {z}; return cimag(z);
return u.a[1];
} }

View File

@ -2,6 +2,5 @@
float (cimagf)(float complex z) float (cimagf)(float complex z)
{ {
union fcomplex u = {z}; return cimagf(z);
return u.a[1];
} }

View File

@ -2,6 +2,5 @@
long double (cimagl)(long double complex z) long double (cimagl)(long double complex z)
{ {
union lcomplex u = {z}; return cimagl(z);
return u.a[1];
} }

View File

@ -1,6 +1,6 @@
#include <complex.h> #include <complex.h>
double creal(double complex z) double (creal)(double complex z)
{ {
return z; return creal(z);
} }

View File

@ -1,6 +1,6 @@
#include <complex.h> #include <complex.h>
float crealf(float complex z) float (crealf)(float complex z)
{ {
return z; return crealf(z);
} }

View File

@ -1,6 +1,6 @@
#include <complex.h> #include <complex.h>
long double creall(long double complex z) long double (creall)(long double complex z)
{ {
return z; return creall(z);
} }

View File

@ -173,14 +173,6 @@ union lcomplex {
long double a[2]; 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 */ /* x + y*I is not supported properly by gcc */
#define cpack(x,y) ((union dcomplex){.a={(x),(y)}}.z) #define cpack(x,y) ((union dcomplex){.a={(x),(y)}}.z)
#define cpackf(x,y) ((union fcomplex){.a={(x),(y)}}.z) #define cpackf(x,y) ((union fcomplex){.a={(x),(y)}}.z)