This is the mail archive of the guile@cygnus.com mailing list for the guile project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]

Re: complex numbers in libguile



    Jim> I take it the custom datatype used by gsl is something like

    Jim> 	struct complex { double x, y };

Actually we moved away from that because the layout of structs and
arrays of structs is not guaranteed.  The internal representation is
now something like:

typedef struct
  {
    double dat[2];
  }
gsl_complex;

#define GSL_REAL(z)     ((z).dat[0])
#define GSL_IMAG(z)     ((z).dat[1])
#define GSL_COMPLEX_P_REAL(zp)  ((zp)->dat[0])
#define GSL_COMPLEX_P_IMAG(zp)  ((zp)->dat[1])
#define GSL_COMPLEX_EQ(z1,z2) ((z1).dat[0] == (z2).dat[0] && \
                               ((z1).dat[1] == (z2).dat[1]))
#define GSL_COMPLEX_SET(z,x,y) do {(z).dat[0]=(x); (z).dat[1]=(y);} while(0)

and it is very important to only access the functions through those
macros.

The rest of what Jim says mostly works; the code should maybe be:

gsl_complex scm2gsl_complex (SCM z);
{
  gsl_complex out;

  if (SCM_CPLXP (z))
    out = GLS_COMPLEX_SET(scm_num2dbl(z), SCM_IMAG(z));
  else
    out = GLS_COMPLEX_SET(scm_num2dbl(z), 0.0);

  return out;
}