public void div(BigFloat other) {
		if (this.isNaN() || other.isNaN()) {
			makeQuietNaN();
			return;
		}

		if (this.isInfinite()) {
			if (other.isInfinite()) {
				makeQuietNaN();
			}
			else {
				sign *= other.sign;
			}
			return;
		}

		// this is finite
		switch (other.kind) {
			case QUIET_NAN:
			case SIGNALING_NAN:
				this.makeQuietNaN();
				return;
			case INFINITE:
				makeZero();
				sign *= other.sign;
				return;
			case FINITE:
				break;
			default:
				throw new AssertionError("unexpected kind " + other.kind);
		}

		if (other.isZero()) {
			if (this.isZero()) {
				makeQuietNaN();
			}
			else {
				this.kind = FloatKind.INFINITE;
				this.sign *= other.sign;
			}
			return;
		}
		// this is finite, other is finite non zero

		// update representations so that this.unscaled has at fracbits+2 -- normal precision plus one for rounding.
		//
		// for numbers a,b
		//   floor(a)-floor(b)-1 <= floor(a-b) <= floor(a)-floor(b)
		//  nbits(x) = floor(log_2(x))+1, so
		//    nbits(x) - nbits(y) <= nbits(x/y) <= nbits(x) - nbits(y) + 1
		// so 
		//   this + lshift - other = fracbits+2 =>
		int lshift = fracbits + 1 + other.unscaled.bitLength() - this.unscaled.bitLength();
		this.upscale(lshift);

		BigInteger qr[] = this.unscaled.divideAndRemainder(other.unscaled);
		BigInteger q = qr[0];
		BigInteger r = qr[1];

		this.sign *= other.sign;
		this.scale -= other.scale - fracbits + 1;
		this.unscaled = q;
		this.internalRound(r.signum() != 0);
	}
{@code this/=other}

@param other a BigFloat
Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/pcode/floatformat/BigFloat.java