trigfills
Version:
Sin, cos, tan, asin, acos and atan filled for cross browser consistency.
460 lines (374 loc) • 11 kB
JavaScript
// tools.js
// ========
var globav =1;
var gdone=2;
bench = function (meth, bentime, meth_nm, meth_arg) {
if( typeof bentime==='undefined' ){ bentime=1 }
if( typeof meth_nm==='undefined' ){ meth_nm=meth.name }
bentime=bentime*22
var qqtlen=1
if(typeof meth_arg!=='undefined')
{ qqtlen=1 }
var tmstamp
if(typeof performance!=='undefined')
{ tmstamp=performance }else{ tmstamp=Date }
var i = 0, retv= 0,retvsum=0,donereps=0;
var minret=0xffffffff>>>0, maxret=0
var atm,btm,ctm,dtm,bdtm,qqtlen
var ra=0,rb=0,rt=0
for (var w=0;w<4;w++)
{
var qreps=0,qtime=0,nreps=100000, repfac=1
atm= tmstamp.now(); rt=9999999999999
ctm = atm, dtm=0
while(ctm-atm<bentime){
if(typeof meth_arg !== 'undefined')
{ for(i=0;i<nreps/10;i++)
{ var r=meth(meth_arg)
if (r>maxret){ maxret=r}
{ if (r<minret){ minret=r } }
}
}else{
for(i=0;i<nreps/10;i++)
{ var r=meth(meth_arg)
if (r>maxret){ maxret=r }
{ if (r<minret){ minret=r } }
}
}
btm= tmstamp.now();
if(typeof meth_arg !== 'undefined'){
for(i=0;i<nreps;i++) { retv+=meth(meth_arg) }
}else{
for(i=0;i<nreps;i++) { retv+=meth() }
}
ctm= tmstamp.now();
bdtm=dtm; dtm=ctm-btm
if (dtm==0){ nreps*=8; }
else
{
if (nreps/(dtm)>(rt*0.9))
{ qreps+=nreps*4;qtime+=dtm*4; }
else
{ qreps+=nreps;qtime+=dtm; } //depreciates low counts
retvsum+=retv;retv=0
donereps+=nreps;
rt=(qreps)/(qtime)
//~ console.log(dtm+" "+nreps)
var timeleft=(bentime-(ctm-atm))
nreps =10+Math.floor(timeleft*rt*0.66);
if (nreps>10000000*timeleft){ nreps=10000000*timeleft }
//nreps=100+(nreps*repfac*0.7)>>>0
}
}
//~ console.log()
if (rt>ra){ rb=ra; ra=rt }
else{ if (rt>rb) { rb=rt } }
}
ops=Math.floor(((ra+rb)*qqtlen*1000)/2)/1000000
console.log(meth_nm+" "+ops+" Mtest/s "+
" avg : "+retvsum/donereps);
if ((retvsum/donereps)>0.5){ globav+=1; }
gdone++;
};
var firstrun=1
benchn = function(n,a,b,c,d){
if(firstrun)
{ firstrun=false;
var k=bench(Math.sqrt,b,c,d)
}
for(var i=0;i<n;i++) { bench(a,b,c,d);}
}
counthalf = function(f,p,p2,rs){
var inner=1000*rs
var outer=1000*rs
var overii=0;
var smores=0;
var mcnt=0;
for(var r=0;r<outer;r++){
var ovri=0;
var cnt=0;
for (var i=0;i<inner;i++)
{
var c=f(p,p2)
cnt+=(c-0.5)
if(c>=0.5){ ovri++ }
}
smores+=ovri;
mcnt+=cnt;
//console.log(ovri/x+" outputs over 0.5")
if ((ovri/inner)>=0.5){ overii++; }
}
console.log(":(s/2): "+ (overii*100)/outer+" "+ (smores*100)/(inner*outer)+" "+(mcnt/(inner*outer))
)
}
cthalf = function(f,p,p2,m){
//console.log(f(p,p2))
if(typeof m==='undefined'){ m=1; }
var s=1000*m, x=40*m
var overii=0;
var mcnt=0,zcnt=0;
for(var r=0;r<x;r++){
var ovri=0;
var cnt=0
var df=0,av=0,bv=Math.random(),cv=Math.random(),zv=0
for (var i=0;i<s;i++)
{
av=bv;bv=cv;cnt+=(df=(cv=f(p,p2))-0.5)
if(df>0.499){ ovri++; }
zv+=Math.abs(bv-cv)+Math.abs(av-cv);
}
var h=ovri/s
if (h==0.001){ overii=overii+0.5; }
else{ if (h>0.001){ overii=overii+1; } }
zcnt+=zv/s
mcnt+=cnt;
}
return [(overii)/(x),mcnt/(s*x),zcnt/x]
}
scanrange= function(fnc,reset,rept,ressq,acc, st,fn,dv,st2,fn2,dv2,mino)
{
console.log("scanning total nums "+rept*ressq*ressq*400000*dv*dv2+
" of "+(dv*dv2)*rept+ "pots")
for(var jf=0;jf<=dv;jf++)
{ var q=st+jf*(fn-st)/dv
//~ console.log((jf/dv).toFixed(3),q)
var qsco=0;
for(var jf2=0;jf2<=dv2;jf2++)
{
var q2=st2+jf2*(fn2-st2)/dv2
qsco+=findhalf(fnc,reset,rept,ressq,acc, q,q,q2,q2,mino)
}
console.log("+] "+q+" : "+qsco+"\n")
}
}
findhalf =function(fnc,reset,rept,ressq,acc, r0,r1,r2,r3,mino)
{
var acca=10,accb=1,accc=1
var sums=0,sumsn=0,tsums=0;
var ps=[
[0.25,0.5]
];
var gn=0,ga=0,gb=0;
var pi=0;
var p,p2
for (var g=0;g<rept;g++)
{
pi=(pi+1); pi=pi%ps.length
//reset();
//~ var p= ps[pi][0] + ((Math.random()+Math.random()+Math.random()-1.5)/(100))
p= r0 + Math.random()*(r1-r0)
p2= r2 + Math.random()*(r3-r2)
//var p2= ps[pi][1]// + ((Math.random()+Math.random()+Math.random()-1.5)/(3*30000))
//~ var p2= ps[pi][1] + ((Math.random()+Math.random()+Math.random()-1.5)/(3*4))
var o=cthalf(fnc,p,p2,ressq)
if( (Math.abs(o[0]-0.5)<(25*acca/acc))
&& (Math.abs(o[1])<(accb/acc))
&& (Math.abs(o[2]-0.66666666666)<(accc/acc)))
{
//~ console.log(
//~ "\n-> "
//~ +o[0].toFixed(5)+" : "
//~ +o[1].toFixed(5)+" : "
//~ +o[2].toFixed(5))
var va=0,vb=0,vz=0,vc=8, oa="",ob="",oc=""
var uva=0,uvb=0,uvz=0
for(var e=0;e<vc;e++){
o=cthalf(fnc,p,p2,ressq) ;
var ta=(0.5-o[0]),tb=o[1],tz=0.66666666666-o[2]
va+=ta
vb+=tb
vz+=tz
uva+=ta+Math.abs(ta);uvb+=tb+Math.abs(tb); uvz+=tz+Math.abs(tz)
oa+=" "+(ta/250).toFixed(6)+","
ob+=" "+tb.toFixed(6)+","
oc+=" "+tz.toFixed(6)+","
}
if(va>0){ va+=Math.abs(uva-va)/2}
else{va-=Math.abs(uva-va)/2}
if(vb>0){ vb+=Math.abs(uvb-vb)/2}
else{vb-=Math.abs(uvb-vb)/2}
if(vz>0){ vz+=Math.abs(uvz-vz)/2}
else{vz-=Math.abs(uvz-vz)/2}
if( (Math.abs(va/vc)<(acca*25*2/acc))
&& (Math.abs(vb/vc)<(accb*2/acc))
&& (Math.abs(vz/vc)<(accc*2/acc)))
{ ga+=p;gb+=p2;gn++;
if(!mino){
console.log(oa); console.log(ob); console.log(oc);
console.log("-> "+(va/(vc*250)).toFixed(7)+" "+(vb/vc).toFixed(7)+" "+(vz/vc).toFixed(7))}
var ss=Math.floor(Math.sqrt(1/(Math.abs(va/(vc*250)))+Math.sqrt(Math.abs(vb/vc))+Math.sqrt(Math.abs(vz/vc))))
sums+=ss;sumsn++; tsums+=ss;
console.log("["+p+","+p2+"] "+ss)
}
}
}
if(!mino&&(ga/gn>0)){console.log(ga/gn,gb/gn)}
if((sumsn>2)){console.log("-] "+(sums/(sumsn+1)).toFixed(3))//+" "+(sums/sumsn).toFixed(3)+" "+sums)
}
return tsums
}
compfunc = function(ma,mb,n){
var ra,rb
if(typeof n==='undefined'){ n=10 }
for(var i=0;i<n;i++){
ra=ma();rb=mb()
if(ra!=rb)
{ console.log("problem with",ma.name,"and",mb.name,"at",i,"iterations");
return}
}
console.log("Fine agree",ma.name,"and",mb.name,"for",n,"iterations");
}
function fnl(num, length) {
var r = "" + num;
while (r.length < length) {
r = " " + r;
}
return r;
}
distrib =function(f,rs, ai,ei, n, a,b,c) //func rs st fn divs
{
var dv=(ei-ai)/rs
var dist=[]
for(var i=0;i<rs;i++) { dist[i]=0; }
for(var i=0; i<n; i++)
{
var p=f(a,b,c)-ai
dist[Math.floor(p/dv)]++
}
var ot="",oh=""
for(var i=0; i<rs; i++)
{
oh+=fnl(((ai+dv*(i+0.5))*100/dv).toFixed(2),9)
ot+=fnl((dist[i]*100/n).toFixed(4),9) }
var lv=0,hv=0
for(var i=0; i<((rs-1)/2); i++)
{
lv+=dist[i]; hv+=dist[rs-1-i]
}
console.log(oh)
console.log(ot)
console.log((lv*100/n).toFixed(7),(hv*100/n).toFixed(7),((lv-hv)*100/n).toFixed(7))
}
checkperiod = function(f,t)
{
while(t>0)
{
checkperiod2(f,f(),f())
t-=1
}
}
checkperiod2 = function(f,s,s2)
{
console.log("checking period of",f.name," (go for tea...)")
var t=1
for(;t<500000000;t++){
//sa=522602
if(f()==s) {
console.log("1 strike")
if(typeof s2==='undefined'){ break; }
else { if(f()==s2){ console.log("2 strikes"); break } }
t++
}
}
console.log("funcs period from seed",s," is "+t)
}
//~ bench2(Fdrandom.d64)
//~ bench2(Fdrandom.f32,5)
//~ bench2(Fdrandom.i32,50)
//~ bench2(Fdrandom.i32q)
pr = function() {
var args = Array.prototype.slice.call(arguments);
var result = args.join(" ");
console.log(result);
}
if (typeof require !=="undefined") var filestreams = require('fs'); //nodejs
savedata =function(fname,fn,n)
{
var resu = new Uint32Array(n)
var k,q=0
for(i=0;i<n;i++)
{ k=fn()
resu[i]=k
q+=k }
var ws = filestreams.createWriteStream(fname);
var b=new Buffer(resu)
a=ws.write(b);
ws.end();
pr(fname+" saved",a/1024,"Kb")
pr("Mean val was "+q/n)
}
savedata2 =function(fname,fn,fn2,n)
{
var resu = new Uint32Array(n)
var k,q=0
for(i=0;i<n;)
{
k=(fn()-fn2())>>>0
resu[i++]=k
//~ k=fn2()
//~ resu[i++]=k
q+=k }
var ws = filestreams.createWriteStream(fname);
var b=new Buffer(resu)
a=ws.write(b);
ws.end();
pr(fname+" saved",a/1024,"Kb")
pr("Mean val was "+q/n)
}
function heredoc (f) {
return f.toString().match(/\/\*\s*([\s\S]*?)\s*\*\//m)[1];
};
cmd_exec= function(cmd, args, cb_stdout, cb_end) {
var spawn = require('child_process').spawn,
child = spawn(cmd, args),
me = this;
me.exit = 0; // Send a cb to set 1 when cmd exits
child.stdout.on('data', function (data) { cb_stdout(me, data) });
child.stdout.on('end', function () { cb_end(me) });
}
diehard=function(rfile,tb){
rfile=rfile.split("/").join("\\")
var nf=rfile.split(".")[0]
console.log(rfile+".n:00:Diehard results")
if(typeof tb==='undefined'){ tb="000011110000000"; }
var txt = rfile+"\r\n"+nf+".txt\r\n"+tb+"\r\n\r\n"
var targs="o:/tmp/dharg"
filestreams.writeFile(targs,txt);
var cmd='O:\\tmp\\dhrd.bat'
var p=''
f = new cmd_exec(cmd, [p],
function (m, data) {m.stdout += data.toString();},
function (m) {m.exit = 1;}
);
function log_console() {
console.log(f.stdout);
}
setTimeout(log_console,3500);
}
imaginefish= function()
{
foodmerc=0.1 //base food contamination level, static
fishmerc=0 //contamination levels of fishes, dynamic
medfishmerc=0
bigfishmerc=0
eatfactor=20 // guessing animals might eat 1/20th of their weight each day
halflifedays=14
lifefactor=Math.pow(0.5,1/halflifedays) //convert halflife to feedtimefac
feedday=0
while(feedday<500)
{
fishmerc=(fishmerc+foodmerc/eatfactor)*lifefactor
medfishmerc=(medfishmerc+fishmerc/eatfactor)*lifefactor
bigfishmerc=(bigfishmerc+medfishmerc/eatfactor)*lifefactor
console.log(feedday, foodmerc, fishmerc, medfishmerc, bigfishmerc)
feedday=feedday+1
}
}
var As,Ai
regurg= function(A)
{
if(As==null||A!=null){ As=A; Ai=0; return NaN}
if(As!=null&&Ai==As.length){ Ai=0; }
return As[Ai++]
}
//~ imaginefish()