public void sqrt() {
		if (this.isZero()) {
			return;
		}

		if (this.isNaN() || this.sign == -1) {
			makeQuietNaN();
			return;
		}

		if (this.isInfinite()) {
			return;
		}
		BigInteger residue;
		BigInteger result;
		BigInteger bit;

		//// force at least fracbits+2 bits of precision in the result
		int sigbits = 2 * fracbits + 2;
		this.scaleUpTo(sigbits);

		// scale+fracbits needs to be even for the sqrt computation
		if (((scale + fracbits - 1) & 1) != 0) {
			upscale(1);
		}

		residue = unscaled;
		result = BigInteger.ZERO;

		/* "bit" starts at the highest 4 power <= n. */
		int pow = residue.bitLength() - 1; // highest 2 power <= n
		pow -= pow & 1; // highest 4 power
		bit = BigInteger.ONE.shiftLeft(pow);

		while (bit.signum() != 0) {
			BigInteger resp1 = result.add(bit);
			if (residue.compareTo(resp1) >= 0) {
				residue = residue.subtract(resp1);
				result = result.add(bit.shiftLeft(1));
			}
			result = result.shiftRight(1);
			bit = bit.shiftRight(2);
		}

		unscaled = result;
		scale = (scale + fracbits - 1) / 2;

		internalRound(residue.signum() != 0);
	}
{@code this=sqrt(this)}

	<p>Square root by abacus algorithm, Martin Guy @ UKC, June 1985.
	From a book on programming abaci by Mr C. Woo.
	Argument is a positive integer, as is result.

 <p>adapted from http://medialab.freaknet.org/martin/src/sqrt/sqrt.c
Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/pcode/floatformat/BigFloat.java