1252884aeSStefan Eßer/* 2252884aeSStefan Eßer * ***************************************************************************** 3252884aeSStefan Eßer * 43aa99676SStefan Eßer * SPDX-License-Identifier: BSD-2-Clause 5252884aeSStefan Eßer * 6*a970610aSStefan Eßer * Copyright (c) 2018-2024 Gavin D. Howard and contributors. 7252884aeSStefan Eßer * 8252884aeSStefan Eßer * Redistribution and use in source and binary forms, with or without 9252884aeSStefan Eßer * modification, are permitted provided that the following conditions are met: 10252884aeSStefan Eßer * 11252884aeSStefan Eßer * * Redistributions of source code must retain the above copyright notice, this 12252884aeSStefan Eßer * list of conditions and the following disclaimer. 13252884aeSStefan Eßer * 14252884aeSStefan Eßer * * Redistributions in binary form must reproduce the above copyright notice, 15252884aeSStefan Eßer * this list of conditions and the following disclaimer in the documentation 16252884aeSStefan Eßer * and/or other materials provided with the distribution. 17252884aeSStefan Eßer * 18252884aeSStefan Eßer * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" 19252884aeSStefan Eßer * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 20252884aeSStefan Eßer * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 21252884aeSStefan Eßer * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE 22252884aeSStefan Eßer * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 23252884aeSStefan Eßer * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 24252884aeSStefan Eßer * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 25252884aeSStefan Eßer * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 26252884aeSStefan Eßer * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 27252884aeSStefan Eßer * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 28252884aeSStefan Eßer * POSSIBILITY OF SUCH DAMAGE. 29252884aeSStefan Eßer * 30252884aeSStefan Eßer * ***************************************************************************** 31252884aeSStefan Eßer * 32252884aeSStefan Eßer * The bc math library. 33252884aeSStefan Eßer * 34252884aeSStefan Eßer */ 35252884aeSStefan Eßer 36252884aeSStefan Eßerdefine e(x){ 37252884aeSStefan Eßer auto b,s,n,r,d,i,p,f,v 38252884aeSStefan Eßer b=ibase 39252884aeSStefan Eßer ibase=A 40252884aeSStefan Eßer if(x<0){ 41252884aeSStefan Eßer n=1 42252884aeSStefan Eßer x=-x 43252884aeSStefan Eßer } 44252884aeSStefan Eßer s=scale 45252884aeSStefan Eßer r=6+s+.44*x 46252884aeSStefan Eßer scale=scale(x)+1 47252884aeSStefan Eßer while(x>1){ 48252884aeSStefan Eßer d+=1 49252884aeSStefan Eßer x/=2 50252884aeSStefan Eßer scale+=1 51252884aeSStefan Eßer } 52252884aeSStefan Eßer scale=r 53252884aeSStefan Eßer r=x+1 54252884aeSStefan Eßer p=x 55252884aeSStefan Eßer f=v=1 56252884aeSStefan Eßer for(i=2;v;++i){ 57252884aeSStefan Eßer p*=x 58252884aeSStefan Eßer f*=i 59252884aeSStefan Eßer v=p/f 60252884aeSStefan Eßer r+=v 61252884aeSStefan Eßer } 62252884aeSStefan Eßer while(d--)r*=r 63252884aeSStefan Eßer scale=s 64252884aeSStefan Eßer ibase=b 65252884aeSStefan Eßer if(n)return(1/r) 66252884aeSStefan Eßer return(r/1) 67252884aeSStefan Eßer} 68252884aeSStefan Eßerdefine l(x){ 69252884aeSStefan Eßer auto b,s,r,p,a,q,i,v 70252884aeSStefan Eßer if(x<=0)return((1-A^scale)/1) 71252884aeSStefan Eßer b=ibase 72252884aeSStefan Eßer ibase=A 73252884aeSStefan Eßer s=scale 74252884aeSStefan Eßer scale+=6 75252884aeSStefan Eßer p=2 76252884aeSStefan Eßer while(x>=2){ 77252884aeSStefan Eßer p*=2 78252884aeSStefan Eßer x=sqrt(x) 79252884aeSStefan Eßer } 80252884aeSStefan Eßer while(x<=.5){ 81252884aeSStefan Eßer p*=2 82252884aeSStefan Eßer x=sqrt(x) 83252884aeSStefan Eßer } 84252884aeSStefan Eßer r=a=(x-1)/(x+1) 85252884aeSStefan Eßer q=a*a 86252884aeSStefan Eßer v=1 87252884aeSStefan Eßer for(i=3;v;i+=2){ 88252884aeSStefan Eßer a*=q 89252884aeSStefan Eßer v=a/i 90252884aeSStefan Eßer r+=v 91252884aeSStefan Eßer } 92252884aeSStefan Eßer r*=p 93252884aeSStefan Eßer scale=s 94252884aeSStefan Eßer ibase=b 95252884aeSStefan Eßer return(r/1) 96252884aeSStefan Eßer} 97252884aeSStefan Eßerdefine s(x){ 98252884aeSStefan Eßer auto b,s,r,a,q,i 99252884aeSStefan Eßer if(x<0)return(-s(-x)) 100252884aeSStefan Eßer b=ibase 101252884aeSStefan Eßer ibase=A 102252884aeSStefan Eßer s=scale 103252884aeSStefan Eßer scale=1.1*s+2 104252884aeSStefan Eßer a=a(1) 105252884aeSStefan Eßer scale=0 106252884aeSStefan Eßer q=(x/a+2)/4 107252884aeSStefan Eßer x-=4*q*a 108252884aeSStefan Eßer if(q%2)x=-x 109252884aeSStefan Eßer scale=s+2 110252884aeSStefan Eßer r=a=x 111252884aeSStefan Eßer q=-x*x 112252884aeSStefan Eßer for(i=3;a;i+=2){ 113252884aeSStefan Eßer a*=q/(i*(i-1)) 114252884aeSStefan Eßer r+=a 115252884aeSStefan Eßer } 116252884aeSStefan Eßer scale=s 117252884aeSStefan Eßer ibase=b 118252884aeSStefan Eßer return(r/1) 119252884aeSStefan Eßer} 120252884aeSStefan Eßerdefine c(x){ 121252884aeSStefan Eßer auto b,s 122252884aeSStefan Eßer b=ibase 123252884aeSStefan Eßer ibase=A 124252884aeSStefan Eßer s=scale 125252884aeSStefan Eßer scale*=1.2 126252884aeSStefan Eßer x=s(2*a(1)+x) 127252884aeSStefan Eßer scale=s 128252884aeSStefan Eßer ibase=b 129252884aeSStefan Eßer return(x/1) 130252884aeSStefan Eßer} 131252884aeSStefan Eßerdefine a(x){ 132252884aeSStefan Eßer auto b,s,r,n,a,m,t,f,i,u 133252884aeSStefan Eßer b=ibase 134252884aeSStefan Eßer ibase=A 135252884aeSStefan Eßer n=1 136252884aeSStefan Eßer if(x<0){ 137252884aeSStefan Eßer n=-1 138252884aeSStefan Eßer x=-x 139252884aeSStefan Eßer } 140252884aeSStefan Eßer if(scale<65){ 141252884aeSStefan Eßer if(x==1){ 142252884aeSStefan Eßer r=.7853981633974483096156608458198757210492923498437764552437361480/n 143252884aeSStefan Eßer ibase=b 144252884aeSStefan Eßer return(r) 145252884aeSStefan Eßer } 146252884aeSStefan Eßer if(x==.2){ 147252884aeSStefan Eßer r=.1973955598498807583700497651947902934475851037878521015176889402/n 148252884aeSStefan Eßer ibase=b 149252884aeSStefan Eßer return(r) 150252884aeSStefan Eßer } 151252884aeSStefan Eßer } 152252884aeSStefan Eßer s=scale 153252884aeSStefan Eßer if(x>.2){ 154252884aeSStefan Eßer scale+=5 155252884aeSStefan Eßer a=a(.2) 156252884aeSStefan Eßer } 157252884aeSStefan Eßer scale=s+3 158252884aeSStefan Eßer while(x>.2){ 159252884aeSStefan Eßer m+=1 160252884aeSStefan Eßer x=(x-.2)/(1+.2*x) 161252884aeSStefan Eßer } 162252884aeSStefan Eßer r=u=x 163252884aeSStefan Eßer f=-x*x 164252884aeSStefan Eßer t=1 165252884aeSStefan Eßer for(i=3;t;i+=2){ 166252884aeSStefan Eßer u*=f 167252884aeSStefan Eßer t=u/i 168252884aeSStefan Eßer r+=t 169252884aeSStefan Eßer } 170252884aeSStefan Eßer scale=s 171252884aeSStefan Eßer ibase=b 172252884aeSStefan Eßer return((m*a+r)/n) 173252884aeSStefan Eßer} 174252884aeSStefan Eßerdefine j(n,x){ 17550696a6eSStefan Eßer auto b,s,o,a,i,r,v,f 176252884aeSStefan Eßer b=ibase 177252884aeSStefan Eßer ibase=A 178252884aeSStefan Eßer s=scale 179252884aeSStefan Eßer scale=0 180252884aeSStefan Eßer n/=1 181252884aeSStefan Eßer if(n<0){ 182252884aeSStefan Eßer n=-n 183252884aeSStefan Eßer o=n%2 184252884aeSStefan Eßer } 185252884aeSStefan Eßer a=1 186252884aeSStefan Eßer for(i=2;i<=n;++i)a*=i 187252884aeSStefan Eßer scale=1.5*s 188252884aeSStefan Eßer a=(x^n)/2^n/a 189252884aeSStefan Eßer r=v=1 190252884aeSStefan Eßer f=-x*x/4 191252884aeSStefan Eßer scale+=length(a)-scale(a) 192252884aeSStefan Eßer for(i=1;v;++i){ 193252884aeSStefan Eßer v=v*f/i/(n+i) 194252884aeSStefan Eßer r+=v 195252884aeSStefan Eßer } 196252884aeSStefan Eßer scale=s 197252884aeSStefan Eßer ibase=b 198252884aeSStefan Eßer if(o)a=-a 199252884aeSStefan Eßer return(a*r/1) 200252884aeSStefan Eßer} 201