trigfills
Version:
Sin, cos, tan, asin, acos and atan filled for cross browser consistency.
300 lines (216 loc) • 6.83 kB
JavaScript
require ('../dlib/mutil.js')
Fdrandom=require ('../dlib/Fdrandom.js')
TRG=require('../trigfills.js')
Fdrandom=Fdrandom.hot()
var tau=Math.PI*2 ,pi=Math.PI
,hpi=Math.PI*0.5 ,qpi=Math.PI*0.25 ,epi=Math.PI*0.125
,sq3=1.7320508075688772 //sqrt(3)
function modp(a,b){
return a-Math.floor(a/b)*b //removes neg
}
function tan(x,f3,f15,f315,f2k,f155k){
var inv=1 ,mut=0 ,mut2=0
x=modp(x,pi)
if(x>hpi){ inv=-1 ,x=pi-x }
if(x>qpi){ mut=1 ,x=hpi-x }
if(x>epi){ mut2=2, x=x*0.5 }
var c=x*x*x, cc=c*c //funky maclaurin series
x= x +c*f3 +c*x*x*f15 +cc*x*f315 +cc*c*f2k +cc*c*x*x*f155k
if(mut2){ x= 2*x/(1-x*x) }
if(mut){ x=1/x }
return inv*x
}
//tweaked factors give atan some extra accuracy
var ff3 =100000000000/300000000002
,ff5 =100000/500002
,ff7 =1000/7001 ,ff9 =1000/8995 ,ff11=1000/1102
function atan(x){
var pos=1, mut=0, mut2=0
if(x<0){ pos=0,x=0-x }
if(x>1){ x=1/x , mut=1 }
if(x>0.26794919){
x=(sq3*x-1)/(sq3+x)
mut2=1;
}
var x2=x*x ,x4=x2*x2 ,x8=x4*x4
x=x- x*x2*ff3 +x4*x*ff5 -x4*x2*x*ff7 +x8*x*ff9 -x8*x2*x*ff11
if(mut2){ x+= hpi*f3 }
if(mut) {x = hpi-x }
if(pos) return x
return -x
}
//~ var f3=1/3,f6=1/6,f120=1/120,f5k=1/5040,f362k=1/364840 //362880
function sintay(x,f6,f120,f5k,f362k){ //taylor series calculation, last fac is tweaked
//if(x>qpi){ return costay(hpi-x) }
var c=x*x*x
return x-(c*f6)+(c*x*x*f120)-(c*c*x*f5k)+(c*c*c*f362k)
}
//~ var f24=1/24,f720=1/720,f40k=1/40580 //orig: 40320
function costay(x,f1,f2,f24,f720,f40k){
//if(x>qpi){ return sintay(hpi-x) }
var x2=x*x,x4=x2*x2
return f1- x2*f2 + x4*f24 - x2*x4*f720 + x4*x4*f40k
}
function funcomp(fna,fnb,s,e,d){
var tt=0, mx=0 , ttv=0, mxv=0//, cntt=0,
,st=(e-s)*0.9999999999/(d-1)
for(var i=s;i<=e;i=i+st){
var x=fna(i),y=fnb(i)
//~ console.log(i.toPrecision(2),x,y,x-y)
var uu=Math.abs(x-y)
tt+=(x-y)*(x-y)
if(uu>mx) mx=uu
var uv, ax=Math.abs(x),ay=Math.abs(y)
uv=Math.abs(x-y)/(ax+ay+0.0001)
ttv+=(uv)*(uv)
if(uv>mxv) mxv=uv
//~ cnt++
}
//~ console.log("tot",tt)
//~ console.log("mx",mx)
return {t:tt,m:mx,tv:ttv,mv:mxv}
}
var tal=100000000000, max=tal, talv=tal, maxv=max,ocount=0
var dz=[100000000000, 10000000000, 100000, 10000, 000]
var tz=[100000013976,19999943266,2399623,7241175, 40578583]
//~ f24=1/24,f720=1/720,f40k=1/40580
//~ var tz=[10012820, 2104810, 2630790, 1874570, 4055459]
//~ var tz=[10003820, 2054810, 2530790, 874570, 4055459]
//~ var tz=[10006651,2104961,2481082,960899,3838061]
/*
999459,209640,232522,81550,40575127
abs pres 0.0010035740980221058 0.0035424820483330732
rel pres 0.00032878846629620905 0.002496933320884178
999617,209751,235716,83742,40573301
abs pres 0.0009309953090351704 0.003453667630372803
rel pres 0.00030682561708208497 0.002446706113872767
1000706,210452,218946,105753,40569247
abs pres 0.000553406011687786 0.002965297819790602
rel pres 0.00018844878745731352 0.002101039051618229
1001282,210481,263079,187457,40554594
abs pres 0.00039969705210796466 0.0025615640915490623
rel pres 0.00013487151457337857 0.0018144575635161062
*/
// 1/2,100000/2399999,100000/71998376,1000/40578583
var fcomp=funcomp
//~ fcomp=funcompx
//~ tsn=300000
var tsn
tsn=10000000
tsn=1300000
//~ tsn=20000000
//~ tsn=10000
//~ tsn=1
var mage=53
/*
*/
var fz=[]; fz[0]=tz[0],fz[1]=tz[1],fz[2]=tz[2],fz[3]=tz[3],fz[4]=tz[4]
//~ var df=[0,0,0,0,1,-1,3,-3,9,-9,30,-30]
var df=[0,0,0,0,-1,1,-2,2]
var mulla=2,mope=0
var zzsteps=187
var alph=1, alp={}
var cntd=2
while(tsn--){
//~ var ofs=Fdrandom.f48()*0.5
var sc = fcomp(
function(x){ return Math.cos(x) }
,function(x){
return costay(x
,dz[0]/tz[0]
,dz[1]/tz[1]
,dz[2]/tz[2]
,dz[3]/tz[3]
,dz[4]/tz[4]
)
}
,0.0000000001, qpi-0.0000000001, zzsteps
)
//~ console.log(sc)
if(alph){ alp.t=sc.t, alp.m=sc.m, alp.mv=sc.mv, alp.tv=sc.tv, alph=0 }
//~ console.log(sc)
if((sc.t<=tal&&sc.m<=max&&sc.tv<=talv&&sc.mv<=maxv)
&&(sc.t<tal||sc.m<max||sc.tv<talv||sc.mv<maxv)
){
tal=sc.t, max=sc.m,talv=sc.tv, maxv=sc.mv,
fz[0]=tz[0]
fz[1]=tz[1]
fz[2]=tz[2]
fz[3]=tz[3]
fz[4]=tz[4]
if(ocount++%cntd===1)
{ cntd++
console.log(fz.join(" "))
console.log("scored:",tal,max)
}
//~ mulla*=1.1
}
//make test set
do{
Fdrandom.mixup(df)
mulla=Fdrandom.f48()*mage+0.5
tz[0] = fz[0]+Math.floor(df[0] *mulla) //*mulla
tz[1] = fz[1]+Math.floor(df[1] *mulla) //*mulla
tz[2] = fz[2]+Math.floor(df[2] *mulla)
tz[3] = fz[3]+Math.floor(df[3] *mulla)
tz[4] = fz[4]+Math.floor(df[4] *mulla)
}while((tz[0]!=fz[0])&&(tz[1]!=fz[1])&&(tz[2]!=fz[2])&&(tz[3]!=fz[3])&&(tz[4]!=fz[4]))
}
console.log("finals for:")
sc = funcomp(
function(x){ return Math.cos(x) }
,function(x){
return costay(x
,dz[0]/fz[0]
,dz[1]/fz[1]
,dz[2]/fz[2]
,dz[3]/fz[3]
,dz[4]/tz[4]
)
}
,0.0000000001, qpi-0.0000000001, zzsteps
)
console.log(fz.join(","))
console.log("abs pres",sc.t,sc.m)
console.log("rel pres",sc.tv,sc.mv)
console.log("abs impv",alp.t-sc.t,alp.m-sc.m)
console.log("rel impv",alp.tv-sc.tv,alp.mv-sc.mv)
console.log(costay(0.78539811350441,dz[0]/fz[0] ,dz[1]/fz[1],dz[2]/fz[2],dz[3]/fz[3],dz[4]/fz[4]))
console.log(Math.cos(0.78539811350441),costay(0.78539811350441,dz[0]/fz[0] ,dz[1]/fz[1],dz[2]/fz[2],dz[3]/fz[3],dz[4]/fz[4])-Math.cos(0.78539811350441))
/*
legacy:
finals for:
200,240,7200,40580000,
abs pres 7.246625313592071e-17 1.4897552080839205e-9
rel pres 2.9383274255551413e-17 1.0533415261528431e-9
1.4897513223033343e-9
finals for:
2000000007,23999991,7199827,4057879,
abs pres 2.4334023490511745e-17 7.879636942931256e-10
rel pres 8.806865517577526e-18 5.571350757545712e-10
7.879612518024715e-10
finals for:
20000000016,239999898,71998276,40578748,
abs pres 2.0624367763888523e-17 8.348285396309052e-10
rel pres 8.226373313558661e-18 5.506516018917415e-10
7.7879136473058e-10
20000000054,239999909,71998299,40578763,
abs pres 2.315379667887314e-17 7.844245253352256e-10
rel pres 8.734347892618555e-18 5.239051625441174e-10
7.409636237909467e-10
19999999995,239999883,71998126,40578812,
abs pres 1.8846617708752458e-17 8.107998716866405e-10
rel pres 7.576131986047034e-18 5.38094262324116e-10
7.610314600725587e-10
finals for:
20000000000,2399999,71998376,40578583,
abs pres 2.0842816822218446e-17 8.754214020356699e-10
rel pres 8.563217431445711e-18 6.131807442695738e-10
8.672270679355165e-10
legacy:
finals for:
200,240,7200,40580000,
abs pres 7.246625313592071e-17 1.4897552080839205e-9
rel pres 2.9383274255551413e-17 1.0533415261528431e-9
1.4897513223033343e-9
*/