protected void internalRound(boolean eps) {
		if (kind != FloatKind.FINITE) {
			throw new AssertionError("Rounding non-finite float");
		}
		if (unscaled.signum() == 0) {
			if (eps) {
				throw new AssertionError("Rounding zero + epsilon, need bit length");
			}
			makeZero();
			return;
		}

		int extrabits = Math.max(unscaled.bitLength() - fracbits, minScale - scale);

		if (extrabits <= 0) {
			throw new AssertionError("Rounding with no extra bits of precision");
		}

		int midbit = extrabits - 1;
		boolean midbitset = this.unscaled.testBit(midbit);
		eps |= unscaled.getLowestSetBit() < midbit;
		unscaled = unscaled.shiftRight(extrabits);
		scale += extrabits;
		boolean odd = unscaled.testBit(0);

		if (midbitset && (eps || odd)) {
			unscaled = unscaled.add(BigInteger.ONE);
			// handle overflowing carry
			if (unscaled.bitLength() > fracbits) {
				assert (unscaled.bitLength() == unscaled.getLowestSetBit() + 1);
				unscaled = unscaled.shiftRight(1);
				scale += 1;
			}
		}

		if (scale > maxScale) {
			kind = FloatKind.INFINITE;
		}
	}
This function is used internally to round after a computation.

<p>Assume that the true value is
<pre>   sign * (unscaled + eps) * 2 ^ (scale-fracbits)
and
  unscaled.bitLength() &gt; fracbits+1 

(or the value is subnormal with at least 1 bit of extra precision)
</pre> 
@param eps &lt; 1
Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/pcode/floatformat/BigFloat.java