diff --git a/curation_calculator.html b/curation_calculator.html
index 63af62f..61b9526 100644
--- a/curation_calculator.html
+++ b/curation_calculator.html
@@ -448,19 +448,21 @@
//Functions for Approx SQRT (see https://github.com/steemit/steem/blob/5c787c5baa651858658caa2bd47473846b099c0a/doc/sqrt.md)
function approx_sqrt(x){
- if(x == 0) return 0;
- msb_x = find_msb(x);
- msb_z = msb_x >> 1;
+ // we don't want to let the code aproximate sqrts from negative inputs..
+ if(x <= 0) return 0;
+
+ var msb_x = find_msb(x);
+ var msb_z = msb_x >> 1;
- msb_x_bit = shiftleft64(1,msb_x);
- msb_z_bit = shiftleft64(1,msb_z);
+ var msb_x_bit = shiftleft64(1,msb_x);
+ var msb_z_bit = shiftleft64(1,msb_z);
- mantissa_mask = msb_x_bit - 1;
- mantissa_x = and64(x,mantissa_mask);
- mantissa_z_hi = and64(msb_x,1) ? msb_z_bit : 0;
- mantissa_z_lo = shiftright64(mantissa_x , msb_x - msb_z);
- mantissa_z = shiftright64(or64(mantissa_z_hi , mantissa_z_lo) , 1);
- result = or64(msb_z_bit , mantissa_z);
+ var mantissa_mask = msb_x_bit - 1;
+ var mantissa_x = and64(x,mantissa_mask);
+ var mantissa_z_hi = and64(msb_x,1) ? msb_z_bit : 0;
+ var mantissa_z_lo = shiftright64(mantissa_x , msb_x - msb_z);
+ var mantissa_z = shiftright64(or64(mantissa_z_hi , mantissa_z_lo) , 1);
+ var result = or64(msb_z_bit , mantissa_z);
return result;
}
@@ -469,43 +471,213 @@
return Math.floor(Math.log(x)/Math.log(2));
}
+ const BIT32_LIMIT = Math.pow(2,32);
+ const BIT64_LIMIT = Math.pow(2,64);
+
function hi_lo(x){
- r = {};
- r.hi = Math.floor(x / Math.pow(2,32));
- r.lo = x % Math.pow(2,32);
+ var r = {};
+ r.hi = Math.floor(x / BIT32_LIMIT);
+ r.lo = x % BIT32_LIMIT;
return r;
}
function and64(x,y){
x = hi_lo(x);
y = hi_lo(y);
- hi = x.hi & y.hi;
- lo = x.lo & y.lo;
- return hi*Math.pow(2,32) + lo;
+ var hi = (x.hi & y.hi) >>> 0;
+ var lo = (x.lo & y.lo) >>> 0;
+ return hi*BIT32_LIMIT + lo;
}
function or64(x,y){
x = hi_lo(x);
y = hi_lo(y);
- hi = x.hi | y.hi;
- lo = x.lo | y.lo;
- return hi*Math.pow(2,32) + lo;
+ var hi = (x.hi | y.hi) >>> 0;
+ var lo = (x.lo | y.lo) >>> 0;
+ return hi*BIT32_LIMIT + lo;
}
function shiftleft64(x,y){
- x = hi_lo(x);
- hi = x.hi * Math.pow(2,y);
- lo = x.lo * Math.pow(2,y);
- return hi*Math.pow(2,32) + lo;
+ return (x * Math.pow(2,y)) % BIT64_LIMIT; // mod64 as a safeguard against 'val' exceeding 64bit integer range
}
function shiftright64(x,y){
- x = hi_lo(x);
- hi = Math.floor(x.hi / Math.pow(2,y));
- aux = x.hi % Math.pow(2,y);
- lo = Math.floor(x.lo / Math.pow(2,y)) + aux * Math.pow(2,32-y);
- return hi*Math.pow(2,32) + lo;
- }
+ return Math.floor(x / Math.pow(2,y));
+ }
+
+