|
|
researchv10 Norman
/* These are unguaranteed math routines lifted from NORGEN "K" code */
static float alogtab[] = {
-.00645354,
.03608849,
-.09532938,
.16765407,
-.24073380,
.33179902,
-.49987412,
.999964239,
};
extern long _fsign2;
float exp(exparg)
float exparg;
{
float ffr();
long fex();
float expd,expz;
float two();
long expc;
expz = exparg*1.44269504;
/* 1/LN(2) */
expc=expz;
expd=expc-expz;
if(expz>=0.0){
expd = expd+1.0;
expc = expc+1;
}
expz=expd*expd;
return(two(expc)*(1.-(2.*expd)/(expd+.034657359*(expz)+9.9545948-
617.97227/(expz+87.417497))));
}
float atan(atanx)
float atanx;
{
if(atanx<0.0) return(-atan(-atanx));
if(atanx>1.0) return(1.57079632-atan(1./atanx));
if(atanx>2.67949192e-1)
return(5.23598775e-1+atan((7.32050808e-1*atanx-1.+atanx)/
(1.732050808+atanx)));
return(atanx*(.60310579-.05160454*atanx*atanx+.55913709/(atanx*atanx+
1.4087812)));
}
float atan2(atan2x1,atan2x2)
float atan2x1,atan2x2;
{
float atan2z;
if(atan2x1<0.0) return(-atan2(-atan2x1,atan2x2));
if(!atan2x2) return(1.5707963);
atan2z = (atan2x1/atan2x2);
if(atan2z<0.) atan2z= -atan2z;
if(atan2z>1.67777e7) return(1.5707963);
if(atan2x2>0.0) return(atan(atan2z));
return(3.14159265-atan(atan2z));
}
float log(alogxx)
float alogxx;
{
float ffr();
long fex();
float p();
float alogx;
float temp;
alogx=ffr(alogxx)*2.-1.;
/* "c" won't take this lovely expression!
return(6.9314718e-1*(fex(alogxx)-1.)+alogx*(.999964239+
alogx*(-.49987412+alogx*(.33179902+alogx*(-.24073380+alogx*(.16765407+
alogx*(-.09532938+alogx*(.03608849+alogx*(-.00645354)))))))));
*/
return(6.9314718e-1*(fex(alogxx)-1)+p(alogx,alogtab,8));
}
float sin(sinx)
float sinx;
{
float psin(),pcos();
long sinq,sinqz;
float sinr,sinz;
sinz=1.2732395*(sinx>=0.0?sinx:-sinx);
sinq=sinz;
sinr=sinz-sinq;
if(sinx<0.0)sinq = sinq+4;
sinqz=sinq&07;
if(!sinqz) return(psin(sinr));
if(sinqz==1) return(pcos(1.0-sinr));
if(sinqz==2) return(pcos(sinr));
if(sinqz==3) return(psin(1.0-sinr));
if(sinqz==4) return(-psin(sinr));
if(sinqz==5) return(-pcos(1.0-sinr));
if(sinqz==6) return(-pcos(sinr));
return(-psin(1.0-sinr));
}
float cos(cosx)
float cosx;
{
float sin();
return(sin(cosx+1.5707963));
}
float psin(psinss)
float psinss;
{
float psinst,psinst2;
psinst2=.78539816*psinss;
psinst=psinst2*psinst2;
return(psinst2*(1.-psinst*(1.66666667e-1-
psinst*(8.33333333e-3-psinst*(1.98412698e-4-psinst*
(2.75573192e-6))))));
}
float pcos(pcoscs)
float pcoscs;
{
float pcosct;
pcosct=.616850275*pcoscs*pcoscs;
return(1.-pcosct*(.5-pcosct*(4.16666667e-2-pcosct*
(1.38888888e-3-pcosct*(2.48015873e-5-pcosct*(2.75573192e-7))))));
}
float sqrt(sqrtarg)
float sqrtarg;
{
float ffr();
long fex();
float sqrtiarg;
float two();
sqrtiarg = two((long)(fex(sqrtarg )*.5-1.))*(1.+ffr(sqrtarg));
sqrtiarg = .5*(sqrtiarg+sqrtarg/sqrtiarg);
sqrtiarg = .5*(sqrtiarg+sqrtarg/sqrtiarg);
sqrtiarg = .5*(sqrtiarg+sqrtarg/sqrtiarg);
return(.5*(sqrtiarg+sqrtarg/sqrtiarg));
}
static long fex(arg)
long arg;
{
if(_fsign2==0100000L) arg >>= 7;
else arg >>= 23;
return((arg&0377)-0200);
}
static long ffr(arg)
long arg;
{
if(arg==0) return(0);
if(_fsign2==0100000L) {
arg = arg & (~077600L);
return(arg|040000L);
}
arg = arg & (~(077600L<<16));
return(arg|(040000L<<16));
}
static long two(arg)
long arg;
{
if(_fsign2==0100000L) return((arg+0201L)<<7);
return((arg+0201L)<<23);
}
static float p(x,t,n)
float x,t[];
int n;
{
int i;
float ans;
ans=t[0];
for(i=1; i<n; i++) ans=ans*x+t[i];
return(x*ans);
}
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.