sbase

suckless unix tools
git clone git://git.suckless.org/sbase
Log | Files | Refs | README | LICENSE

bc.library (4237B)


      1 /*
      2  * Copyright (C) Caldera International Inc.  2001-2002.
      3  * All rights reserved.
      4  *
      5  * Redistribution and use in source and binary forms, with or without
      6  * modification, are permitted provided that the following conditions
      7  * are met:
      8  * 1. Redistributions of source code and documentation must retain the above
      9  *    copyright notice, this list of conditions and the following disclaimer.
     10  * 2. Redistributions in binary form must reproduce the above copyright
     11  *    notice, this list of conditions and the following disclaimer in the
     12  *    documentation and/or other materials provided with the distribution.
     13  * 3. All advertising materials mentioning features or use of this software
     14  *    must display the following acknowledgement:
     15  *      This product includes software developed or owned by Caldera
     16  *      International, Inc.
     17  * 4. Neither the name of Caldera International, Inc. nor the names of other
     18  *    contributors may be used to endorse or promote products derived from
     19  *    this software without specific prior written permission.
     20  *
     21  * USE OF THE SOFTWARE PROVIDED FOR UNDER THIS LICENSE BY CALDERA
     22  * INTERNATIONAL, INC. AND CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR
     23  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
     24  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
     25  * IN NO EVENT SHALL CALDERA INTERNATIONAL, INC. BE LIABLE FOR ANY DIRECT,
     26  * INDIRECT INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
     27  * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
     28  * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
     29  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
     30  * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
     31  * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
     32  * POSSIBILITY OF SUCH DAMAGE.
     33  */
     34 
     35 /*
     36  *
     37  *	@(#)bc.library	8.1 (Berkeley) 6/6/93
     38  */
     39 
     40 scale = 20
     41 define e(x){
     42 	auto a, b, c, d, e, g, t, w, y
     43 
     44 	t = scale
     45 	scale = t + .434*x + 1
     46 
     47 	w = 0
     48 	if(x<0){
     49 		x = -x
     50 		w = 1
     51 	}
     52 	y = 0
     53 	while(x>2){
     54 		x = x/2
     55 		y = y + 1
     56 	}
     57 
     58 	a=1
     59 	b=1
     60 	c=b
     61 	d=1
     62 	e=1
     63 	for(a=1;1==1;a++){
     64 		b=b*x
     65 		c=c*a+b
     66 		d=d*a
     67 		g = c/d
     68 		if(g == e){
     69 			g = g/1
     70 			while(y--){
     71 				g = g*g
     72 			}
     73 			scale = t
     74 			if(w==1) return(1/g)
     75 			return(g/1)
     76 		}
     77 		e=g
     78 	}
     79 }
     80 
     81 define l(x){
     82 	auto a, b, c, d, e, f, g, u, s, t
     83 	if(x <=0) return(1-10^scale)
     84 	t = scale
     85 
     86 	f=1
     87 	scale = scale + scale(x) - length(x) + 1
     88 	s=scale
     89 	while(x > 2){
     90 		s = s + (length(x)-scale(x))/2 + 1
     91 		if(s>0) scale = s
     92 		x = sqrt(x)
     93 		f=f*2
     94 	}
     95 	while(x < .5){
     96 		s = s + (length(x)-scale(x))/2 + 1
     97 		if(s>0) scale = s
     98 		x = sqrt(x)
     99 		f=f*2
    100 	}
    101 
    102 	scale = t + length(f) - scale(f) + 1
    103 	u = (x-1)/(x+1)
    104 
    105 	scale = scale + 1.1*length(t) - 1.1*scale(t)
    106 	s = u*u
    107 	b = 2*f
    108 	c = b
    109 	d = 1
    110 	e = 1
    111 	for(a=3;1==1;a=a+2){
    112 		b=b*s
    113 		c=c*a+d*b
    114 		d=d*a
    115 		g=c/d
    116 		if(g==e){
    117 			scale = t
    118 			return(u*c/d)
    119 		}
    120 		e=g
    121 	}
    122 }
    123 
    124 define s(x){
    125 	auto a, b, c, s, t, y, p, n, i
    126 	t = scale
    127 	y = x/.7853
    128 	s = t + length(y) - scale(y)
    129 	if(s<t) s=t
    130 	scale = s
    131 	p = a(1)
    132 
    133 	scale = 0
    134 	if(x>=0) n = (x/(2*p)+1)/2
    135 	if(x<0) n = (x/(2*p)-1)/2
    136 	x = x - 4*n*p
    137 	if(n%2!=0) x = -x
    138 
    139 	scale = t + length(1.2*t) - scale(1.2*t)
    140 	y = -x*x
    141 	a = x
    142 	b = 1
    143 	s = x
    144 	for(i=3; 1==1; i=i+2){
    145 		a = a*y
    146 		b = b*i*(i-1)
    147 		c = a/b
    148 		if(c==0){scale=t; return(s/1)}
    149 		s = s+c
    150 	}
    151 }
    152 
    153 define c(x){
    154 	auto t
    155 	t = scale
    156 	scale = scale+1
    157 	x = s(x+2*a(1))
    158 	scale = t
    159 	return(x/1)
    160 }
    161 
    162 define a(x){
    163 	auto a, b, c, d, e, f, g, s, t
    164 	if(x==0) return(0)
    165 	if(x==1) {
    166 		if(scale<52) {
    167 return(.7853981633974483096156608458198757210492923498437764/1)
    168 		}
    169 	}
    170 	t = scale
    171 	f=1
    172 	while(x > .5){
    173 		scale = scale + 1
    174 		x= -(1-sqrt(1.+x*x))/x
    175 		f=f*2
    176 	}
    177 	while(x < -.5){
    178 		scale = scale + 1
    179 		x = -(1-sqrt(1.+x*x))/x
    180 		f=f*2
    181 	}
    182 	s = -x*x
    183 	b = f
    184 	c = f
    185 	d = 1
    186 	e = 1
    187 	for(a=3;1==1;a=a+2){
    188 		b=b*s
    189 		c=c*a+d*b
    190 		d=d*a
    191 		g=c/d
    192 		if(g==e){
    193 			scale = t
    194 			return(x*c/d)
    195 		}
    196 		e=g
    197 	}
    198 }
    199 
    200 define j(n,x){
    201 auto a,b,c,d,e,g,i,s,k,t
    202 
    203 	t = scale
    204 	k = 1.36*x + 1.16*t - n
    205 	k = length(k) - scale(k)
    206 	if(k>0) scale = scale + k
    207 
    208 s= -x*x/4
    209 if(n<0){
    210 	n= -n
    211 	x= -x
    212 	}
    213 a=1
    214 c=1
    215 for(i=1;i<=n;i++){
    216 	a=a*x
    217 	c = c*2*i
    218 	}
    219 b=a
    220 d=1
    221 e=1
    222 for(i=1;1;i++){
    223 	a=a*s
    224 	b=b*i*(n+i) + a
    225 	c=c*i*(n+i)
    226 	g=b/c
    227 	if(g==e){
    228 		scale = t
    229 		return(g/1)
    230 		}
    231 	e=g
    232 	}
    233 }