xref: /aosp_15_r20/external/bc/gen/lib.bc (revision 5a6e848804d15c18a0125914844ee4eb0bda4fcf)
1*5a6e8488SAndroid Build Coastguard Worker/*
2*5a6e8488SAndroid Build Coastguard Worker * *****************************************************************************
3*5a6e8488SAndroid Build Coastguard Worker *
4*5a6e8488SAndroid Build Coastguard Worker * SPDX-License-Identifier: BSD-2-Clause
5*5a6e8488SAndroid Build Coastguard Worker *
6*5a6e8488SAndroid Build Coastguard Worker * Copyright (c) 2018-2024 Gavin D. Howard and contributors.
7*5a6e8488SAndroid Build Coastguard Worker *
8*5a6e8488SAndroid Build Coastguard Worker * Redistribution and use in source and binary forms, with or without
9*5a6e8488SAndroid Build Coastguard Worker * modification, are permitted provided that the following conditions are met:
10*5a6e8488SAndroid Build Coastguard Worker *
11*5a6e8488SAndroid Build Coastguard Worker * * Redistributions of source code must retain the above copyright notice, this
12*5a6e8488SAndroid Build Coastguard Worker *   list of conditions and the following disclaimer.
13*5a6e8488SAndroid Build Coastguard Worker *
14*5a6e8488SAndroid Build Coastguard Worker * * Redistributions in binary form must reproduce the above copyright notice,
15*5a6e8488SAndroid Build Coastguard Worker *   this list of conditions and the following disclaimer in the documentation
16*5a6e8488SAndroid Build Coastguard Worker *   and/or other materials provided with the distribution.
17*5a6e8488SAndroid Build Coastguard Worker *
18*5a6e8488SAndroid Build Coastguard Worker * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
19*5a6e8488SAndroid Build Coastguard Worker * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
20*5a6e8488SAndroid Build Coastguard Worker * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
21*5a6e8488SAndroid Build Coastguard Worker * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
22*5a6e8488SAndroid Build Coastguard Worker * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
23*5a6e8488SAndroid Build Coastguard Worker * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
24*5a6e8488SAndroid Build Coastguard Worker * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
25*5a6e8488SAndroid Build Coastguard Worker * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
26*5a6e8488SAndroid Build Coastguard Worker * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
27*5a6e8488SAndroid Build Coastguard Worker * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
28*5a6e8488SAndroid Build Coastguard Worker * POSSIBILITY OF SUCH DAMAGE.
29*5a6e8488SAndroid Build Coastguard Worker *
30*5a6e8488SAndroid Build Coastguard Worker * *****************************************************************************
31*5a6e8488SAndroid Build Coastguard Worker *
32*5a6e8488SAndroid Build Coastguard Worker * The bc math library.
33*5a6e8488SAndroid Build Coastguard Worker *
34*5a6e8488SAndroid Build Coastguard Worker */
35*5a6e8488SAndroid Build Coastguard Worker
36*5a6e8488SAndroid Build Coastguard Workerdefine e(x){
37*5a6e8488SAndroid Build Coastguard Worker	auto b,s,n,r,d,i,p,f,v
38*5a6e8488SAndroid Build Coastguard Worker	b=ibase
39*5a6e8488SAndroid Build Coastguard Worker	ibase=A
40*5a6e8488SAndroid Build Coastguard Worker	if(x<0){
41*5a6e8488SAndroid Build Coastguard Worker		n=1
42*5a6e8488SAndroid Build Coastguard Worker		x=-x
43*5a6e8488SAndroid Build Coastguard Worker	}
44*5a6e8488SAndroid Build Coastguard Worker	s=scale
45*5a6e8488SAndroid Build Coastguard Worker	r=6+s+.44*x
46*5a6e8488SAndroid Build Coastguard Worker	scale=scale(x)+1
47*5a6e8488SAndroid Build Coastguard Worker	while(x>1){
48*5a6e8488SAndroid Build Coastguard Worker		d+=1
49*5a6e8488SAndroid Build Coastguard Worker		x/=2
50*5a6e8488SAndroid Build Coastguard Worker		scale+=1
51*5a6e8488SAndroid Build Coastguard Worker	}
52*5a6e8488SAndroid Build Coastguard Worker	scale=r
53*5a6e8488SAndroid Build Coastguard Worker	r=x+1
54*5a6e8488SAndroid Build Coastguard Worker	p=x
55*5a6e8488SAndroid Build Coastguard Worker	f=v=1
56*5a6e8488SAndroid Build Coastguard Worker	for(i=2;v;++i){
57*5a6e8488SAndroid Build Coastguard Worker		p*=x
58*5a6e8488SAndroid Build Coastguard Worker		f*=i
59*5a6e8488SAndroid Build Coastguard Worker		v=p/f
60*5a6e8488SAndroid Build Coastguard Worker		r+=v
61*5a6e8488SAndroid Build Coastguard Worker	}
62*5a6e8488SAndroid Build Coastguard Worker	while(d--)r*=r
63*5a6e8488SAndroid Build Coastguard Worker	scale=s
64*5a6e8488SAndroid Build Coastguard Worker	ibase=b
65*5a6e8488SAndroid Build Coastguard Worker	if(n)return(1/r)
66*5a6e8488SAndroid Build Coastguard Worker	return(r/1)
67*5a6e8488SAndroid Build Coastguard Worker}
68*5a6e8488SAndroid Build Coastguard Workerdefine l(x){
69*5a6e8488SAndroid Build Coastguard Worker	auto b,s,r,p,a,q,i,v
70*5a6e8488SAndroid Build Coastguard Worker	if(x<=0)return((1-A^scale)/1)
71*5a6e8488SAndroid Build Coastguard Worker	b=ibase
72*5a6e8488SAndroid Build Coastguard Worker	ibase=A
73*5a6e8488SAndroid Build Coastguard Worker	s=scale
74*5a6e8488SAndroid Build Coastguard Worker	scale+=6
75*5a6e8488SAndroid Build Coastguard Worker	p=2
76*5a6e8488SAndroid Build Coastguard Worker	while(x>=2){
77*5a6e8488SAndroid Build Coastguard Worker		p*=2
78*5a6e8488SAndroid Build Coastguard Worker		x=sqrt(x)
79*5a6e8488SAndroid Build Coastguard Worker	}
80*5a6e8488SAndroid Build Coastguard Worker	while(x<=.5){
81*5a6e8488SAndroid Build Coastguard Worker		p*=2
82*5a6e8488SAndroid Build Coastguard Worker		x=sqrt(x)
83*5a6e8488SAndroid Build Coastguard Worker	}
84*5a6e8488SAndroid Build Coastguard Worker	r=a=(x-1)/(x+1)
85*5a6e8488SAndroid Build Coastguard Worker	q=a*a
86*5a6e8488SAndroid Build Coastguard Worker	v=1
87*5a6e8488SAndroid Build Coastguard Worker	for(i=3;v;i+=2){
88*5a6e8488SAndroid Build Coastguard Worker		a*=q
89*5a6e8488SAndroid Build Coastguard Worker		v=a/i
90*5a6e8488SAndroid Build Coastguard Worker		r+=v
91*5a6e8488SAndroid Build Coastguard Worker	}
92*5a6e8488SAndroid Build Coastguard Worker	r*=p
93*5a6e8488SAndroid Build Coastguard Worker	scale=s
94*5a6e8488SAndroid Build Coastguard Worker	ibase=b
95*5a6e8488SAndroid Build Coastguard Worker	return(r/1)
96*5a6e8488SAndroid Build Coastguard Worker}
97*5a6e8488SAndroid Build Coastguard Workerdefine s(x){
98*5a6e8488SAndroid Build Coastguard Worker	auto b,s,r,a,q,i
99*5a6e8488SAndroid Build Coastguard Worker	if(x<0)return(-s(-x))
100*5a6e8488SAndroid Build Coastguard Worker	b=ibase
101*5a6e8488SAndroid Build Coastguard Worker	ibase=A
102*5a6e8488SAndroid Build Coastguard Worker	s=scale
103*5a6e8488SAndroid Build Coastguard Worker	scale=1.1*s+2
104*5a6e8488SAndroid Build Coastguard Worker	a=a(1)
105*5a6e8488SAndroid Build Coastguard Worker	scale=0
106*5a6e8488SAndroid Build Coastguard Worker	q=(x/a+2)/4
107*5a6e8488SAndroid Build Coastguard Worker	x-=4*q*a
108*5a6e8488SAndroid Build Coastguard Worker	if(q%2)x=-x
109*5a6e8488SAndroid Build Coastguard Worker	scale=s+2
110*5a6e8488SAndroid Build Coastguard Worker	r=a=x
111*5a6e8488SAndroid Build Coastguard Worker	q=-x*x
112*5a6e8488SAndroid Build Coastguard Worker	for(i=3;a;i+=2){
113*5a6e8488SAndroid Build Coastguard Worker		a*=q/(i*(i-1))
114*5a6e8488SAndroid Build Coastguard Worker		r+=a
115*5a6e8488SAndroid Build Coastguard Worker	}
116*5a6e8488SAndroid Build Coastguard Worker	scale=s
117*5a6e8488SAndroid Build Coastguard Worker	ibase=b
118*5a6e8488SAndroid Build Coastguard Worker	return(r/1)
119*5a6e8488SAndroid Build Coastguard Worker}
120*5a6e8488SAndroid Build Coastguard Workerdefine c(x){
121*5a6e8488SAndroid Build Coastguard Worker	auto b,s
122*5a6e8488SAndroid Build Coastguard Worker	b=ibase
123*5a6e8488SAndroid Build Coastguard Worker	ibase=A
124*5a6e8488SAndroid Build Coastguard Worker	s=scale
125*5a6e8488SAndroid Build Coastguard Worker	scale*=1.2
126*5a6e8488SAndroid Build Coastguard Worker	x=s(2*a(1)+x)
127*5a6e8488SAndroid Build Coastguard Worker	scale=s
128*5a6e8488SAndroid Build Coastguard Worker	ibase=b
129*5a6e8488SAndroid Build Coastguard Worker	return(x/1)
130*5a6e8488SAndroid Build Coastguard Worker}
131*5a6e8488SAndroid Build Coastguard Workerdefine a(x){
132*5a6e8488SAndroid Build Coastguard Worker	auto b,s,r,n,a,m,t,f,i,u
133*5a6e8488SAndroid Build Coastguard Worker	b=ibase
134*5a6e8488SAndroid Build Coastguard Worker	ibase=A
135*5a6e8488SAndroid Build Coastguard Worker	n=1
136*5a6e8488SAndroid Build Coastguard Worker	if(x<0){
137*5a6e8488SAndroid Build Coastguard Worker		n=-1
138*5a6e8488SAndroid Build Coastguard Worker		x=-x
139*5a6e8488SAndroid Build Coastguard Worker	}
140*5a6e8488SAndroid Build Coastguard Worker	if(scale<65){
141*5a6e8488SAndroid Build Coastguard Worker		if(x==1){
142*5a6e8488SAndroid Build Coastguard Worker			r=.7853981633974483096156608458198757210492923498437764552437361480/n
143*5a6e8488SAndroid Build Coastguard Worker			ibase=b
144*5a6e8488SAndroid Build Coastguard Worker			return(r)
145*5a6e8488SAndroid Build Coastguard Worker		}
146*5a6e8488SAndroid Build Coastguard Worker		if(x==.2){
147*5a6e8488SAndroid Build Coastguard Worker			r=.1973955598498807583700497651947902934475851037878521015176889402/n
148*5a6e8488SAndroid Build Coastguard Worker			ibase=b
149*5a6e8488SAndroid Build Coastguard Worker			return(r)
150*5a6e8488SAndroid Build Coastguard Worker		}
151*5a6e8488SAndroid Build Coastguard Worker	}
152*5a6e8488SAndroid Build Coastguard Worker	s=scale
153*5a6e8488SAndroid Build Coastguard Worker	if(x>.2){
154*5a6e8488SAndroid Build Coastguard Worker		scale+=5
155*5a6e8488SAndroid Build Coastguard Worker		a=a(.2)
156*5a6e8488SAndroid Build Coastguard Worker	}
157*5a6e8488SAndroid Build Coastguard Worker	scale=s+3
158*5a6e8488SAndroid Build Coastguard Worker	while(x>.2){
159*5a6e8488SAndroid Build Coastguard Worker		m+=1
160*5a6e8488SAndroid Build Coastguard Worker		x=(x-.2)/(1+.2*x)
161*5a6e8488SAndroid Build Coastguard Worker	}
162*5a6e8488SAndroid Build Coastguard Worker	r=u=x
163*5a6e8488SAndroid Build Coastguard Worker	f=-x*x
164*5a6e8488SAndroid Build Coastguard Worker	t=1
165*5a6e8488SAndroid Build Coastguard Worker	for(i=3;t;i+=2){
166*5a6e8488SAndroid Build Coastguard Worker		u*=f
167*5a6e8488SAndroid Build Coastguard Worker		t=u/i
168*5a6e8488SAndroid Build Coastguard Worker		r+=t
169*5a6e8488SAndroid Build Coastguard Worker	}
170*5a6e8488SAndroid Build Coastguard Worker	scale=s
171*5a6e8488SAndroid Build Coastguard Worker	ibase=b
172*5a6e8488SAndroid Build Coastguard Worker	return((m*a+r)/n)
173*5a6e8488SAndroid Build Coastguard Worker}
174*5a6e8488SAndroid Build Coastguard Workerdefine j(n,x){
175*5a6e8488SAndroid Build Coastguard Worker	auto b,s,o,a,i,r,v,f
176*5a6e8488SAndroid Build Coastguard Worker	b=ibase
177*5a6e8488SAndroid Build Coastguard Worker	ibase=A
178*5a6e8488SAndroid Build Coastguard Worker	s=scale
179*5a6e8488SAndroid Build Coastguard Worker	scale=0
180*5a6e8488SAndroid Build Coastguard Worker	n/=1
181*5a6e8488SAndroid Build Coastguard Worker	if(n<0){
182*5a6e8488SAndroid Build Coastguard Worker		n=-n
183*5a6e8488SAndroid Build Coastguard Worker		o=n%2
184*5a6e8488SAndroid Build Coastguard Worker	}
185*5a6e8488SAndroid Build Coastguard Worker	a=1
186*5a6e8488SAndroid Build Coastguard Worker	for(i=2;i<=n;++i)a*=i
187*5a6e8488SAndroid Build Coastguard Worker	scale=1.5*s
188*5a6e8488SAndroid Build Coastguard Worker	a=(x^n)/2^n/a
189*5a6e8488SAndroid Build Coastguard Worker	r=v=1
190*5a6e8488SAndroid Build Coastguard Worker	f=-x*x/4
191*5a6e8488SAndroid Build Coastguard Worker	scale+=length(a)-scale(a)
192*5a6e8488SAndroid Build Coastguard Worker	for(i=1;v;++i){
193*5a6e8488SAndroid Build Coastguard Worker		v=v*f/i/(n+i)
194*5a6e8488SAndroid Build Coastguard Worker		r+=v
195*5a6e8488SAndroid Build Coastguard Worker	}
196*5a6e8488SAndroid Build Coastguard Worker	scale=s
197*5a6e8488SAndroid Build Coastguard Worker	ibase=b
198*5a6e8488SAndroid Build Coastguard Worker	if(o)a=-a
199*5a6e8488SAndroid Build Coastguard Worker	return(a*r/1)
200*5a6e8488SAndroid Build Coastguard Worker}
201