|
|
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: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.