plan9port

fork of plan9port with libvec, libstr and libsdb
Log | Files | Refs | README | LICENSE

cosadd.c (889B)


      1 #include "astro.h"
      2 
      3 
      4 void
      5 icosadd(double *fp, char *cp)
      6 {
      7 
      8 	cafp = fp;
      9 	cacp = cp;
     10 }
     11 
     12 double
     13 cosadd(int n, ...)
     14 {
     15 	double *coefp, coef[10];
     16 	char *cp;
     17 	int i;
     18 	double sum, a1, a2;
     19 	va_list arg;
     20 
     21 	sum = 0;
     22 	cp = cacp;
     23 	va_start(arg, n);
     24 	for(i=0; i<n; i++)
     25 		coef[i] = va_arg(arg, double);
     26 	va_end(arg);
     27 
     28 loop:
     29 	a1 = *cafp++;
     30 	if(a1 == 0) {
     31 		cacp = cp;
     32 		return sum;
     33 	}
     34 	a2 = *cafp++;
     35 	i = n;
     36 	coefp = coef;
     37 	do
     38 		a2 += *cp++ * *coefp++;
     39 	while(--i);
     40 	sum += a1 * cos(a2);
     41 	goto loop;
     42 }
     43 
     44 double
     45 sinadd(int n, ...)
     46 {
     47 	double *coefp, coef[10];
     48 	char *cp;
     49 	int i;
     50 	double sum, a1, a2;
     51 	va_list arg;
     52 
     53 	sum = 0;
     54 	cp = cacp;
     55 	va_start(arg, n);
     56 	for(i=0; i<n; i++)
     57 		coef[i] = va_arg(arg, double);
     58 	va_end(arg);
     59 
     60 loop:
     61 	a1 = *cafp++;
     62 	if(a1 == 0) {
     63 		cacp = cp;
     64 		return sum;
     65 	}
     66 	a2 = *cafp++;
     67 	i = n;
     68 	coefp = coef;
     69 	do
     70 		a2 += *cp++ * *coefp++;
     71 	while(--i);
     72 	sum += a1 * sin(a2);
     73 	goto loop;
     74 }