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)); + } + +