Annotation of 3BSD/cmd/lisp/lam8.c, revision 1.1.1.1

1.1       root        1: #include "global.h"
                      2: 
                      3: /* various functions from the c math library */
                      4: double sin(),cos(),asin(),acos(),atan2(),sqrt(), log(), exp();
                      5: 
                      6: lispval Imath(func)
                      7: double func();
                      8: {
                      9:        register lispval handy;
                     10:        register double res;
                     11:        chkarg(1);
                     12: 
                     13:        switch(TYPE(handy=lbot->val)) {
                     14:         case INT: res = func((double)handy->i); 
                     15:                   break;
                     16: 
                     17:         case DOUB: res = func(handy->r);
                     18:                   break;
                     19: 
                     20:         default:  error("Non fixnum or flonum to math function",FALSE);
                     21:        }
                     22:        handy = newdoub();
                     23:        handy->r = res;
                     24:        return(handy);
                     25: }
                     26: lispval Lsin()
                     27: {
                     28:        return(Imath(sin));
                     29: }
                     30: 
                     31: lispval Lcos()
                     32: {
                     33:        return(Imath(cos));
                     34: }
                     35: 
                     36: lispval Lasin()
                     37: {
                     38:        return(Imath(asin));
                     39: }
                     40: 
                     41: lispval Lacos()
                     42: {
                     43:        return(Imath(acos));
                     44: }
                     45: 
                     46: lispval Lsqrt()
                     47: {
                     48:        return(Imath(sqrt));
                     49: }
                     50: lispval Lexp()
                     51: {
                     52:        return(Imath(exp));
                     53: }
                     54: 
                     55: lispval Llog()
                     56: {
                     57:        return(Imath(log));
                     58: }
                     59: 
                     60: /* although we call this atan, it is really atan2 to the c-world,
                     61:    that is, it takes two args
                     62:  */
                     63: lispval Latan()
                     64: {
                     65:        register lispval arg;
                     66:        register double arg1v;
                     67:        register double res;
                     68:        chkarg(2);
                     69: 
                     70:        switch(TYPE(arg=lbot->val)) {
                     71: 
                     72:        case INT:  arg1v = (double) arg->i;
                     73:                   break;
                     74: 
                     75:        case DOUB: arg1v = arg->r;
                     76:                   break;
                     77: 
                     78:        default:   error("Non fixnum or flonum arg to atan2",FALSE);
                     79:        }
                     80: 
                     81:        switch(TYPE(arg = (lbot+1)->val)) {
                     82: 
                     83:        case INT: res = atan2(arg1v,(double) arg->i);
                     84:                  break;
                     85: 
                     86:        case DOUB: res = atan2(arg1v, arg->r);
                     87:                  break;
                     88: 
                     89:        default:  error("Non fixnum or flonum to atan2",FALSE);
                     90:        }
                     91:        arg = newdoub();
                     92:        arg->r = res;
                     93:        return(arg);
                     94: }
                     95: 
                     96: /* (random) returns a fixnum in the range -2**30 to 2**30 -1
                     97:    (random fixnum) returns a fixnum in the range 0 to fixnum-1
                     98:  */
                     99: lispval
                    100: Lrandom()
                    101: {
                    102:        register int curval;
                    103:        float pow();
                    104: 
                    105:        curval = rand();        /* get numb from 0 to 2**31-1 */
                    106: 
                    107:        if(np==lbot) return(inewint(curval-(int)pow((double)2,(double)30)));
                    108: 
                    109:        if((TYPE(lbot->val) != INT)
                    110:            || (lbot->val->i <= 0)) errorh(Vermisc,"random: non fixnum arg:",
                    111:                                                 nil, FALSE, 0, lbot->val);
                    112: 
                    113:        return(inewint(curval % lbot->val->i )); 
                    114: 
                    115: }
                    116: lispval
                    117: Lmakunb()
                    118: {
                    119:        register lispval work;
                    120: 
                    121:        chkarg(1);
                    122:        work = lbot->val;
                    123:        if(work==nil || (TYPE(work)!=ATOM))
                    124:                return(work);
                    125:        work->clb = CNIL;
                    126:        return(work);
                    127: }
                    128: lispval
                    129: Lpolyev()
                    130: {
                    131:        register int count; 
                    132:        register double *handy, *base;
                    133:        register struct argent *argp, *lbot, *np;
                    134:        lispval result; int type;
                    135: 
                    136:        count = 2 * (((int) np) - (int) lbot);
                    137:        if(count == 0) 
                    138:                return(inewint(0));
                    139:        if(count == 8)
                    140:                return(lbot->val);
                    141:        base = handy = (double *) alloca(count);
                    142:        for(argp = lbot; argp < np; argp++) {
                    143:                while((type = TYPE(argp->val))!=DOUB && type!=INT)
                    144:                        argp->val = (lispval) errorh(Vermisc,"%%machine-polyev:non-real arg",nil,TRUE,73,lbot,argp->val);
                    145:                if(TYPE(argp->val)==INT) {
                    146:                        *handy++ = argp->val->i;
                    147:                } else
                    148:                        *handy++ = argp->val->r;
                    149:        }
                    150:        count = count/sizeof(double) - 2;
                    151:        asm("polyd      (r9),r11,8(r9)");
                    152:        asm("movd       r0,(r9)");
                    153:        result = newdoub();
                    154:        result->r = *base;
                    155:        return(result);
                    156: }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.