Probability Calculator
by jnichols
HTML
<img src="http://i.imgur.com/McV5qBt.gif" width="570px"/>
<div id="controls">
<label>W <br/><input type="number" id="W" value="100"/></label>
<label>t <br /><input type="number" id="t" value = "1"/></label>
<label>q <br /><input type="number" id="q" value="5500"/></label><br/>
<button id="plot">Plot</button>
</div>
<div id="graph" class="graphContainer"></div>
CSS
label{
display:block;
float:left;
}
div.graphContainer{
height:375px;
width:550px;
background-color:white;
}
div
{
width:550px;
text-align:center;
background-color:lightblue;
padding:10px;
}
input
{
width:8em;
text-align:right;
}
.axis path, .axis line
{
stroke:black;
stroke-width:2;
shape-rendering:crisp;
fill:none;
}
path.line{
stroke-width:8px;
}
.overlay {
fill: none;
pointer-events: all;
}
svg{
fill:white;
}
svg text{
stroke:none;
fill:black;
font-weight:bold;
}
.axis .tick text{
font-weight:normal;
}
JavaScript
var log = 3;
function nCr(n,r){
var p=1;
var twos = 0;
//var log =5;
for(var i=0; i<r; i++){
p= p * (n-i) / (2*i+2);
if((p ==0) && log>0){
console.warn("Failed in multiplication phase :nCr("+n+"," + r+")");
console.log("Twos : "+ twos);
log--;
}
while(!isFinite(p*(n-i-1)/(i+2)))
{
p=p/2;
twos++;
}
}
while(twos>0 && p<1000000){
p=p*2;
twos--;
}
for(i; i<n; i++){
if(twos>0)
twos--;
else if(p/2>0)
p=p/2;
else
twos--;
}
while(twos>0){
p=p*2;
twos--;
}
if(((p ==0) ||(twos !=0)) && log>0){
console.warn("Failed at :nCr("+n+"," + r+")");
console.log("Twos : "+ twos);
log--;
}
return p;
}
function P(W,t,q){
//Known
q = q || 1000;
W = W || 100;
t = t || 1;
var s, n, k;
var prod=[];
for(n=1; n<=q; n++)
{
k=(W+(t*n))/2/t;
if(n%2==0 && n>=k)
{
//multiply some big numbers
s=nCr(n,k);
}
else
s=0;
prod.push(1-s);
}
return prod;
}
function process(prod){
var data=[];
var temp=1;
for (var j =0; j<prod.length; j++)
{
data[j]={x:j, y:(1-prod[j]*temp)};
temp=prod[j]*temp;
}
return data;
}
function processIndividual(prod,pop,da){
var data=[];
var temp;
var t2;
var logLim = 10;
for (var j =0; j<prod.length; j++)
{
t2 = j>0?da[j-1].y*1:0;
temp = 1 - Math.pow((1-da[j].y*1+t2),pop);
if(j%2==0 && j>0)
temp=data[j-1].y;
if(logLim > 0 && isNaN(temp))
{
logLim--;
console.log(j);
console.log(prod[j]);
console.log(Math.pow((prod[j]),pop));
...