|
|
1.1 root 1: /* These are unguaranteed math routines lifted from NORGEN "K" code */
2:
3: static float alogtab[] = {
4: -.00645354,
5: .03608849,
6: -.09532938,
7: .16765407,
8: -.24073380,
9: .33179902,
10: -.49987412,
11: .999964239,
12: };
13:
14: extern long _fsign2;
15: float exp(exparg)
16: float exparg;
17: {
18: float ffr();
19: long fex();
20: float expd,expz;
21: float two();
22: long expc;
23: expz = exparg*1.44269504;
24: /* 1/LN(2) */
25: expc=expz;
26: expd=expc-expz;
27: if(expz>=0.0){
28: expd = expd+1.0;
29: expc = expc+1;
30: }
31: expz=expd*expd;
32: return(two(expc)*(1.-(2.*expd)/(expd+.034657359*(expz)+9.9545948-
33: 617.97227/(expz+87.417497))));
34: }
35: float atan(atanx)
36: float atanx;
37: {
38: if(atanx<0.0) return(-atan(-atanx));
39: if(atanx>1.0) return(1.57079632-atan(1./atanx));
40: if(atanx>2.67949192e-1)
41: return(5.23598775e-1+atan((7.32050808e-1*atanx-1.+atanx)/
42: (1.732050808+atanx)));
43: return(atanx*(.60310579-.05160454*atanx*atanx+.55913709/(atanx*atanx+
44: 1.4087812)));
45: }
46: float atan2(atan2x1,atan2x2)
47: float atan2x1,atan2x2;
48: {
49: float atan2z;
50: if(atan2x1<0.0) return(-atan2(-atan2x1,atan2x2));
51: if(!atan2x2) return(1.5707963);
52: atan2z = (atan2x1/atan2x2);
53: if(atan2z<0.) atan2z= -atan2z;
54: if(atan2z>1.67777e7) return(1.5707963);
55: if(atan2x2>0.0) return(atan(atan2z));
56: return(3.14159265-atan(atan2z));
57: }
58: float log(alogxx)
59: float alogxx;
60: {
61: float ffr();
62: long fex();
63: float p();
64: float alogx;
65: float temp;
66: alogx=ffr(alogxx)*2.-1.;
67: /* "c" won't take this lovely expression!
68: return(6.9314718e-1*(fex(alogxx)-1.)+alogx*(.999964239+
69: alogx*(-.49987412+alogx*(.33179902+alogx*(-.24073380+alogx*(.16765407+
70: alogx*(-.09532938+alogx*(.03608849+alogx*(-.00645354)))))))));
71: */
72:
73: return(6.9314718e-1*(fex(alogxx)-1)+p(alogx,alogtab,8));
74: }
75: float sin(sinx)
76: float sinx;
77: {
78: float psin(),pcos();
79: long sinq,sinqz;
80: float sinr,sinz;
81: sinz=1.2732395*(sinx>=0.0?sinx:-sinx);
82: sinq=sinz;
83: sinr=sinz-sinq;
84: if(sinx<0.0)sinq = sinq+4;
85: sinqz=sinq&07;
86: if(!sinqz) return(psin(sinr));
87: if(sinqz==1) return(pcos(1.0-sinr));
88: if(sinqz==2) return(pcos(sinr));
89: if(sinqz==3) return(psin(1.0-sinr));
90: if(sinqz==4) return(-psin(sinr));
91: if(sinqz==5) return(-pcos(1.0-sinr));
92: if(sinqz==6) return(-pcos(sinr));
93: return(-psin(1.0-sinr));
94: }
95: float cos(cosx)
96: float cosx;
97: {
98: float sin();
99: return(sin(cosx+1.5707963));
100: }
101: float psin(psinss)
102: float psinss;
103: {
104: float psinst,psinst2;
105: psinst2=.78539816*psinss;
106: psinst=psinst2*psinst2;
107: return(psinst2*(1.-psinst*(1.66666667e-1-
108: psinst*(8.33333333e-3-psinst*(1.98412698e-4-psinst*
109: (2.75573192e-6))))));
110: }
111: float pcos(pcoscs)
112: float pcoscs;
113: {
114: float pcosct;
115: pcosct=.616850275*pcoscs*pcoscs;
116: return(1.-pcosct*(.5-pcosct*(4.16666667e-2-pcosct*
117: (1.38888888e-3-pcosct*(2.48015873e-5-pcosct*(2.75573192e-7))))));
118: }
119: float sqrt(sqrtarg)
120: float sqrtarg;
121: {
122: float ffr();
123: long fex();
124: float sqrtiarg;
125: float two();
126: sqrtiarg = two((long)(fex(sqrtarg )*.5-1.))*(1.+ffr(sqrtarg));
127: sqrtiarg = .5*(sqrtiarg+sqrtarg/sqrtiarg);
128: sqrtiarg = .5*(sqrtiarg+sqrtarg/sqrtiarg);
129: sqrtiarg = .5*(sqrtiarg+sqrtarg/sqrtiarg);
130: return(.5*(sqrtiarg+sqrtarg/sqrtiarg));
131: }
132:
133: static long fex(arg)
134: long arg;
135: {
136: if(_fsign2==0100000L) arg >>= 7;
137: else arg >>= 23;
138: return((arg&0377)-0200);
139: }
140:
141: static long ffr(arg)
142: long arg;
143: {
144: if(arg==0) return(0);
145: if(_fsign2==0100000L) {
146: arg = arg & (~077600L);
147: return(arg|040000L);
148: }
149: arg = arg & (~(077600L<<16));
150: return(arg|(040000L<<16));
151: }
152:
153: static long two(arg)
154: long arg;
155: {
156: if(_fsign2==0100000L) return((arg+0201L)<<7);
157: return((arg+0201L)<<23);
158: }
159: static float p(x,t,n)
160: float x,t[];
161: int n;
162: {
163: int i;
164: float ans;
165: ans=t[0];
166: for(i=1; i<n; i++) ans=ans*x+t[i];
167: return(x*ans);
168: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.