Article View: comp.lang.lisp.x
Article #226Complex/Rational math package, Patch2
From: Ray Comas
Date: Wed, 12 Dec 1990 01:27
Date: Wed, 12 Dec 1990 01:27
152 lines
5381 bytes
5381 bytes
This is another patch for my complex/rational number package.
Currently, the real and imaginary parts of complex numbers are stored
as part of a "struct node". This means that every node requires ca.
18 bytes of space, which is almost twice as much as previously required.
This patch addresses that problem. The real and imaginary parts are now
kept in a dynamically allocated array (much like the STRING type), which
means nodes are now back to 9--10 bytes, just like they used to be.
The changes are to dldmem.c, dlimage.c, and xldmem.h
Note that you will have to come up with your own fixes to xldmem.c and
xlimage.c if you use these instead of dldmem.c and dlimage.c
Also, if there are any functions or features that you would like to see
added to this package, let me know.
============ CUT HERE ============ CUT HERE ============ CUT HERE ============
diff +context orig/dldmem.c ./dldmem.c
*** orig/dldmem.c Mon Dec 03 17:28:32 1990
--- ./dldmem.c Tue Dec 11 17:22:34 1990
***************
*** 330,338 ****
LVAL val;
if (i==0.0) return cvflonum(r);
! val = newnode(COMPLEX);
! val->n_complex.xc_real = r;
! val->n_complex.xc_imag = i;
return val;
}
#endif
--- 330,339 ----
LVAL val;
if (i==0.0) return cvflonum(r);
! val = allocvector(COMPLEX,btow_size(2*sizeof(FLOTYPE)));
! val->n_vsize = 2*sizeof(FLOTYPE);
! val->n_complex.xc_data[0] = r;
! val->n_complex.xc_data[1] = i;
return val;
}
#endif
***************
*** 803,811 ****
--- 804,822 ----
while (vdata < vfree) {
vector = *vdata;
#ifdef JGC
+ #ifdef COMPLEX_TYPES
+ if ((vector->n_type & TYPEFIELD)==STRING
+ || (vector->n_type & TYPEFIELD)==COMPLEX)
+ #else
if ((vector->n_type & TYPEFIELD) == STRING)
+ #endif
#else
+ #ifdef COMPLEX_TYPES
+ if (vector->n_type==STRING
+ || vector->n_type==COMPLEX)
+ #else
if (vector->n_type == STRING)
+ #endif
#endif
vsize = btow_size(vector->n_vsize) + 1;
else
diff +context orig/dlimage.c ./dlimage.c
*** orig/dlimage.c Tue Dec 11 17:26:36 1990
--- ./dlimage.c Tue Dec 11 17:25:48 1990
***************
*** 124,129 ****
--- 124,132 ----
for (i = 0; i < max; ++i)
writeptr(cvoptr(getelement(p,i)));
break;
+ #ifdef COMPLEX_TYPES
+ case COMPLEX:
+ #endif
case STRING:
max = getslength(p);
fwrite(getstring(p),1,max,fp);
***************
*** 227,232 ****
--- 230,238 ----
for (i = 0; i < max; ++i)
setelement(p,i,cviptr(readptr()));
break;
+ #ifdef COMPLEX_TYPES
+ case COMPLEX:
+ #endif
case STRING:
max = getslength(p);
p->n_string = (char *)getvspace(p,btow_size(max));
diff +context orig/xldmem.h ./xldmem.h
*** orig/xldmem.h Mon Dec 03 16:13:02 1990
--- ./xldmem.h Tue Dec 11 16:36:30 1990
***************
*** 79,86 ****
#ifdef COMPLEX_TYPES
#define getrnumer(x) ((x)->n_rational.xr_num)
#define getrdenom(x) ((x)->n_rational.xr_den)
! #define getcreal(x) ((x)->n_complex.xc_real)
! #define getcimag(x) ((x)->n_complex.xc_imag)
#endif
/* string access macros */
--- 79,86 ----
#ifdef COMPLEX_TYPES
#define getrnumer(x) ((x)->n_rational.xr_num)
#define getrdenom(x) ((x)->n_rational.xr_den)
! #define getcreal(x) ((x)->n_complex.xc_data[0])
! #define getcimag(x) ((x)->n_complex.xc_data[1])
#endif
/* string access macros */
***************
*** 223,229 ****
FIXTYPE xr_num, xr_den; /* numerator & denominator */
} n_xrational;
struct xcomplex { /* complex node */
! FLOTYPE xc_real, xc_imag; /* real & imaginary parts */
} n_xcomplex;
#endif
struct xstring { /* string node */
--- 223,230 ----
FIXTYPE xr_num, xr_den; /* numerator & denominator */
} n_xrational;
struct xcomplex { /* complex node */
! int xc_dummy;
! FLOTYPE *xc_data; /* real & imaginary parts */
} n_xcomplex;
#endif
struct xstring { /* string node */
***************
*** 308,314 ****
extern LVAL cvflonum(); /* convert a flonum */
#ifdef COMPLEX_TYPES
extern LVAL cvrational(); /* convert a rational */
! extern LVAL cvcomplex() /* convert a complex */
#endif
extern LVAL newstring(); /* create a new string */
extern LVAL newvector(); /* create a new vector */
--- 309,315 ----
extern LVAL cvflonum(); /* convert a flonum */
#ifdef COMPLEX_TYPES
extern LVAL cvrational(); /* convert a rational */
! extern LVAL cvcomplex(); /* convert a complex */
#endif
extern LVAL newstring(); /* create a new string */
extern LVAL newvector(); /* create a new vector */
============ CUT HERE ============ CUT HERE ============ CUT HERE ============
Ray Comas (comas@math.lsa.umich.edu)
Department of mathematics
University of Michigan
Technical Details
Message-ID:
<1990Dec12.012759.4137@math.lsa.umich.edu>Path:
arc1-ca.pugleaf.net!utzoo!utgpu!news-server.csri.toronto.edu!cs.utexas.edu!sdd.hp.com!uakari.primate.wisc.edu!caen!math.lsa.umich.edu!math.lsa.umich.edu!comasShow Full Headers
Complete Article Headers
Path: arc1-ca.pugleaf.net!utzoo!utgpu!news-server.csri.toronto.edu!cs.utexas.edu!sdd.hp.com!uakari.primate.wisc.edu!caen!math.lsa.umich.edu!math.lsa.umich.edu!comas
From: comas@math.lsa.umich.edu (Ray Comas)
Newsgroups: comp.lang.lisp.x
Subject: Complex/Rational math package, Patch2
Message-ID: <1990Dec12.012759.4137@math.lsa.umich.edu>
Date: 12 Dec 90 01:27:59 GMT
Sender: usenet@math.lsa.umich.edu
Reply-To: comas@math.lsa.umich.edu (Ray Comas)
Organization: University of Michigan Math Dept., Ann Arbor
Lines: 152
Uucp-Path: {mailrus,umix}!um-math!comas