xref: /plan9/sys/lib/bclib (revision 3e12c5d1bb89fc02707907988834ef147769ddaf)
1*3e12c5d1SDavid du Colombierscale = 50
2*3e12c5d1SDavid du Colombierdefine e(x) {
3*3e12c5d1SDavid du Colombier	auto a, b, c, d, e, g, w, y, t, r
4*3e12c5d1SDavid du Colombier
5*3e12c5d1SDavid du Colombier	r = ibase
6*3e12c5d1SDavid du Colombier	ibase = A
7*3e12c5d1SDavid du Colombier
8*3e12c5d1SDavid du Colombier	t = scale
9*3e12c5d1SDavid du Colombier	scale = t + .434*x + 1
10*3e12c5d1SDavid du Colombier
11*3e12c5d1SDavid du Colombier	w = 0
12*3e12c5d1SDavid du Colombier	if(x<0) {
13*3e12c5d1SDavid du Colombier		x = -x
14*3e12c5d1SDavid du Colombier		w = 1
15*3e12c5d1SDavid du Colombier	}
16*3e12c5d1SDavid du Colombier	y = 0
17*3e12c5d1SDavid du Colombier	while(x>2) {
18*3e12c5d1SDavid du Colombier		x /= 2
19*3e12c5d1SDavid du Colombier		y++
20*3e12c5d1SDavid du Colombier	}
21*3e12c5d1SDavid du Colombier
22*3e12c5d1SDavid du Colombier	a = 1
23*3e12c5d1SDavid du Colombier	b = 1
24*3e12c5d1SDavid du Colombier	c = b
25*3e12c5d1SDavid du Colombier	d = 1
26*3e12c5d1SDavid du Colombier	e = 1
27*3e12c5d1SDavid du Colombier	for(a=1; 1; a++) {
28*3e12c5d1SDavid du Colombier		b *= x
29*3e12c5d1SDavid du Colombier		c = c*a+b
30*3e12c5d1SDavid du Colombier		d *= a
31*3e12c5d1SDavid du Colombier		g = c/d
32*3e12c5d1SDavid du Colombier		if(g == e) {
33*3e12c5d1SDavid du Colombier			g = g/1
34*3e12c5d1SDavid du Colombier			while(y--) {
35*3e12c5d1SDavid du Colombier				g *= g
36*3e12c5d1SDavid du Colombier			}
37*3e12c5d1SDavid du Colombier			scale = t
38*3e12c5d1SDavid du Colombier			if(w==1) {
39*3e12c5d1SDavid du Colombier				ibase = r
40*3e12c5d1SDavid du Colombier				return 1/g
41*3e12c5d1SDavid du Colombier			}
42*3e12c5d1SDavid du Colombier			ibase = r
43*3e12c5d1SDavid du Colombier			return g/1
44*3e12c5d1SDavid du Colombier		}
45*3e12c5d1SDavid du Colombier		e = g
46*3e12c5d1SDavid du Colombier	}
47*3e12c5d1SDavid du Colombier}
48*3e12c5d1SDavid du Colombier
49*3e12c5d1SDavid du Colombierdefine l(x) {
50*3e12c5d1SDavid du Colombier	auto a, b, c, d, e, f, g, u, s, t, r, z
51*3e12c5d1SDavid du Colombier
52*3e12c5d1SDavid du Colombier	r = ibase
53*3e12c5d1SDavid du Colombier	ibase = A
54*3e12c5d1SDavid du Colombier	if(x <= 0) {
55*3e12c5d1SDavid du Colombier		z = 1-10^scale
56*3e12c5d1SDavid du Colombier		ibase = r
57*3e12c5d1SDavid du Colombier		return z
58*3e12c5d1SDavid du Colombier	}
59*3e12c5d1SDavid du Colombier	t = scale
60*3e12c5d1SDavid du Colombier
61*3e12c5d1SDavid du Colombier	f = 1
62*3e12c5d1SDavid du Colombier	scale += scale(x) - length(x) + 1
63*3e12c5d1SDavid du Colombier	s = scale
64*3e12c5d1SDavid du Colombier	while(x > 2) {
65*3e12c5d1SDavid du Colombier		s += (length(x)-scale(x))/2 + 1
66*3e12c5d1SDavid du Colombier		if(s>0) {
67*3e12c5d1SDavid du Colombier			scale = s
68*3e12c5d1SDavid du Colombier		}
69*3e12c5d1SDavid du Colombier		x = sqrt(x)
70*3e12c5d1SDavid du Colombier		f *= 2
71*3e12c5d1SDavid du Colombier	}
72*3e12c5d1SDavid du Colombier	while(x < .5) {
73*3e12c5d1SDavid du Colombier		s += (length(x)-scale(x))/2 + 1
74*3e12c5d1SDavid du Colombier		if(s>0) {
75*3e12c5d1SDavid du Colombier			scale = s
76*3e12c5d1SDavid du Colombier		}
77*3e12c5d1SDavid du Colombier		x = sqrt(x)
78*3e12c5d1SDavid du Colombier		f *= 2
79*3e12c5d1SDavid du Colombier	}
80*3e12c5d1SDavid du Colombier
81*3e12c5d1SDavid du Colombier	scale = t + length(f) - scale(f) + 1
82*3e12c5d1SDavid du Colombier	u = (x-1)/(x+1)
83*3e12c5d1SDavid du Colombier
84*3e12c5d1SDavid du Colombier	scale += 1.1*length(t) - 1.1*scale(t)
85*3e12c5d1SDavid du Colombier	s = u*u
86*3e12c5d1SDavid du Colombier	b = 2*f
87*3e12c5d1SDavid du Colombier	c = b
88*3e12c5d1SDavid du Colombier	d = 1
89*3e12c5d1SDavid du Colombier	e = 1
90*3e12c5d1SDavid du Colombier	for(a=3; 1; a=a+2){
91*3e12c5d1SDavid du Colombier		b *= s
92*3e12c5d1SDavid du Colombier		c = c*a + d*b
93*3e12c5d1SDavid du Colombier		d *= a
94*3e12c5d1SDavid du Colombier		g = c/d
95*3e12c5d1SDavid du Colombier		if(g==e) {
96*3e12c5d1SDavid du Colombier			scale = t
97*3e12c5d1SDavid du Colombier			ibase = r
98*3e12c5d1SDavid du Colombier			return u*c/d
99*3e12c5d1SDavid du Colombier		}
100*3e12c5d1SDavid du Colombier		e = g
101*3e12c5d1SDavid du Colombier	}
102*3e12c5d1SDavid du Colombier}
103*3e12c5d1SDavid du Colombier
104*3e12c5d1SDavid du Colombierdefine s(x) {
105*3e12c5d1SDavid du Colombier	auto a, b, c, s, t, y, p, n, i, r
106*3e12c5d1SDavid du Colombier
107*3e12c5d1SDavid du Colombier	r = ibase
108*3e12c5d1SDavid du Colombier	ibase = A
109*3e12c5d1SDavid du Colombier	t = scale
110*3e12c5d1SDavid du Colombier	y = x/.7853
111*3e12c5d1SDavid du Colombier	s = t + length(y) - scale(y)
112*3e12c5d1SDavid du Colombier	if(s<t) {
113*3e12c5d1SDavid du Colombier		s = t
114*3e12c5d1SDavid du Colombier	}
115*3e12c5d1SDavid du Colombier	scale = s
116*3e12c5d1SDavid du Colombier	p = a(1)
117*3e12c5d1SDavid du Colombier
118*3e12c5d1SDavid du Colombier	scale = 0
119*3e12c5d1SDavid du Colombier	if(x>=0) {
120*3e12c5d1SDavid du Colombier		n = (x/(2*p)+1)/2
121*3e12c5d1SDavid du Colombier	}
122*3e12c5d1SDavid du Colombier	if(x<0) {
123*3e12c5d1SDavid du Colombier		n = (x/(2*p)-1)/2
124*3e12c5d1SDavid du Colombier	}
125*3e12c5d1SDavid du Colombier	x -= 4*n*p
126*3e12c5d1SDavid du Colombier	if(n%2 != 0) {
127*3e12c5d1SDavid du Colombier		x = -x
128*3e12c5d1SDavid du Colombier	}
129*3e12c5d1SDavid du Colombier
130*3e12c5d1SDavid du Colombier	scale = t + length(1.2*t) - scale(1.2*t)
131*3e12c5d1SDavid du Colombier	y = -x*x
132*3e12c5d1SDavid du Colombier	a = x
133*3e12c5d1SDavid du Colombier	b = 1
134*3e12c5d1SDavid du Colombier	s = x
135*3e12c5d1SDavid du Colombier	for(i=3; 1; i+=2) {
136*3e12c5d1SDavid du Colombier		a *= y
137*3e12c5d1SDavid du Colombier		b *= i*(i-1)
138*3e12c5d1SDavid du Colombier		c = a/b
139*3e12c5d1SDavid du Colombier		if(c==0){
140*3e12c5d1SDavid du Colombier			scale = t
141*3e12c5d1SDavid du Colombier			ibase = r
142*3e12c5d1SDavid du Colombier			return s/1
143*3e12c5d1SDavid du Colombier		}
144*3e12c5d1SDavid du Colombier		s += c
145*3e12c5d1SDavid du Colombier	}
146*3e12c5d1SDavid du Colombier}
147*3e12c5d1SDavid du Colombier
148*3e12c5d1SDavid du Colombierdefine c(x) {
149*3e12c5d1SDavid du Colombier	auto t, r
150*3e12c5d1SDavid du Colombier
151*3e12c5d1SDavid du Colombier	r = ibase
152*3e12c5d1SDavid du Colombier	ibase = A
153*3e12c5d1SDavid du Colombier	t = scale
154*3e12c5d1SDavid du Colombier	scale = scale+1
155*3e12c5d1SDavid du Colombier	x = s(x + 2*a(1))
156*3e12c5d1SDavid du Colombier	scale = t
157*3e12c5d1SDavid du Colombier	ibase = r
158*3e12c5d1SDavid du Colombier	return x/1
159*3e12c5d1SDavid du Colombier}
160*3e12c5d1SDavid du Colombier
161*3e12c5d1SDavid du Colombierdefine a(x) {
162*3e12c5d1SDavid du Colombier	auto a, b, c, d, e, f, g, s, t, r, z
163*3e12c5d1SDavid du Colombier
164*3e12c5d1SDavid du Colombier	r = ibase
165*3e12c5d1SDavid du Colombier	ibase = A
166*3e12c5d1SDavid du Colombier	if(x==0) {
167*3e12c5d1SDavid du Colombier		return 0
168*3e12c5d1SDavid du Colombier	}
169*3e12c5d1SDavid du Colombier	if(x==1) {
170*3e12c5d1SDavid du Colombier		z = .7853981633974483096156608458198757210492923498437764/1
171*3e12c5d1SDavid du Colombier		ibase = r
172*3e12c5d1SDavid du Colombier		if(scale<52) {
173*3e12c5d1SDavid du Colombier			return z
174*3e12c5d1SDavid du Colombier		}
175*3e12c5d1SDavid du Colombier	}
176*3e12c5d1SDavid du Colombier	t = scale
177*3e12c5d1SDavid du Colombier	f = 1
178*3e12c5d1SDavid du Colombier	while(x > .5) {
179*3e12c5d1SDavid du Colombier		scale++
180*3e12c5d1SDavid du Colombier		x = -(1 - sqrt(1.+x*x))/x
181*3e12c5d1SDavid du Colombier		f *= 2
182*3e12c5d1SDavid du Colombier	}
183*3e12c5d1SDavid du Colombier	while(x < -.5) {
184*3e12c5d1SDavid du Colombier		scale++
185*3e12c5d1SDavid du Colombier		x = -(1 - sqrt(1.+x*x))/x
186*3e12c5d1SDavid du Colombier		f *= 2
187*3e12c5d1SDavid du Colombier	}
188*3e12c5d1SDavid du Colombier	s = -x*x
189*3e12c5d1SDavid du Colombier	b = f
190*3e12c5d1SDavid du Colombier	c = f
191*3e12c5d1SDavid du Colombier	d = 1
192*3e12c5d1SDavid du Colombier	e = 1
193*3e12c5d1SDavid du Colombier	for(a=3; 1; a+=2) {
194*3e12c5d1SDavid du Colombier		b *= s
195*3e12c5d1SDavid du Colombier		c = c*a + d*b
196*3e12c5d1SDavid du Colombier		d *= a
197*3e12c5d1SDavid du Colombier		g = c/d
198*3e12c5d1SDavid du Colombier		if(g==e) {
199*3e12c5d1SDavid du Colombier			scale = t
200*3e12c5d1SDavid du Colombier			ibase = r
201*3e12c5d1SDavid du Colombier			return x*c/d
202*3e12c5d1SDavid du Colombier		}
203*3e12c5d1SDavid du Colombier		e = g
204*3e12c5d1SDavid du Colombier	}
205*3e12c5d1SDavid du Colombier}
206*3e12c5d1SDavid du Colombier
207*3e12c5d1SDavid du Colombierdefine j(n,x) {
208*3e12c5d1SDavid du Colombier	auto a,b,c,d,e,g,i,s,k,t,r
209*3e12c5d1SDavid du Colombier
210*3e12c5d1SDavid du Colombier	r = ibase
211*3e12c5d1SDavid du Colombier	ibase = A
212*3e12c5d1SDavid du Colombier
213*3e12c5d1SDavid du Colombier	t = scale
214*3e12c5d1SDavid du Colombier	k = 1.36*x + 1.16*t - n
215*3e12c5d1SDavid du Colombier	k = length(k) - scale(k)
216*3e12c5d1SDavid du Colombier	if(k>0) {
217*3e12c5d1SDavid du Colombier		scale += k
218*3e12c5d1SDavid du Colombier	}
219*3e12c5d1SDavid du Colombier
220*3e12c5d1SDavid du Colombier	s = -x*x/4
221*3e12c5d1SDavid du Colombier	if(n<0) {
222*3e12c5d1SDavid du Colombier		n = -n
223*3e12c5d1SDavid du Colombier		x = -x
224*3e12c5d1SDavid du Colombier	}
225*3e12c5d1SDavid du Colombier	a = 1
226*3e12c5d1SDavid du Colombier	c = 1
227*3e12c5d1SDavid du Colombier	for(i=1; i<=n; i++) {
228*3e12c5d1SDavid du Colombier		a *= x
229*3e12c5d1SDavid du Colombier		c *= 2*i
230*3e12c5d1SDavid du Colombier	}
231*3e12c5d1SDavid du Colombier	b = a
232*3e12c5d1SDavid du Colombier	d = 1
233*3e12c5d1SDavid du Colombier	e = 1
234*3e12c5d1SDavid du Colombier	for(i=1; 1; i++) {
235*3e12c5d1SDavid du Colombier		a *= s
236*3e12c5d1SDavid du Colombier		b = b*i*(n+i) + a
237*3e12c5d1SDavid du Colombier		c *= i*(n+i)
238*3e12c5d1SDavid du Colombier		g = b/c
239*3e12c5d1SDavid du Colombier		if(g==e) {
240*3e12c5d1SDavid du Colombier			scale = t
241*3e12c5d1SDavid du Colombier			ibase = r
242*3e12c5d1SDavid du Colombier			return g/1
243*3e12c5d1SDavid du Colombier		}
244*3e12c5d1SDavid du Colombier		e = g
245*3e12c5d1SDavid du Colombier	}
246*3e12c5d1SDavid du Colombier}
247