function hi(n) {
  if(doubleBits.denormalized(n)) {
    return -(1023 + lz(doubleBits.fraction(n)))
  } else {
    return doubleBits.exponent(n)
  }
}
function doubleToBase2String(n) {
  if(n === Infinity) {
    return "∞"
  } else if(n === -Infinity) {
    return "-∞"
  } else if(isNaN(n)) {
    return "NaN"
  }
  var sign = db.sign(n)
  if(n === 0) {
    if(sign) {
      return "-0"
    } else {
      return "0"
    }
  } else if(n === 1) {
    return "1"
  } else if(n === -1) {
    return "-1"
  }
  var exponent = db.exponent(n)
  var fraction = db.fraction(n)
  var b0 = pad(fraction[0].toString(2), 32, "0")
  var b1 = fraction[1].toString(2)
  var str = b1 + b0
  if(db.denormalized(n)) {
    if(!fraction[1]) {
      str = fraction[0].toString(2)
    }
    exponent = -1023 - (52 - str.length)
  }
  var nz = str.length-1
  while(nz >= 0 && str.charAt(nz) === "0") {
    nz -= 1
  }
  str = str.substr(0, nz+1)
  if(str.length > 1) {
    str = (sign ? "-" : "") + "1." + str.substr(1)
    if(exponent) {
      if(exponent === 1) {
        str += "*2"
      } else {
        str += "*2^" + exponent
      }
    }
  } else {
    str = (sign ? "-" : "") + "2"
    if(exponent !== 1) {
      str += "^" + exponent
    }
  }
  return str
}
function floatToBigNum(a) {
  var fa = db.fraction(a)
  var ea = db.exponent(a)
  var na = BN(fa[0]&((1<<24)-1))
  na = na.add(BN(fa[0]>>>24).ishln(24))
  na = na.add(BN(fa[1]).ishln(32))
  if(!db.denormalized(a)) {
    na.ishln(ea+1022)
  }
  if(a < 0) {
    return na.neg()
  }
  return na
}
function lo(n) {
  var e = doubleBits.exponent(n)
  var f = doubleBits.fraction(n)
  var z = tz(f)
  return e - (52 - z)
}