protected void sub0(BigFloat other) {
		int d = this.scale - other.scale;

		if (d > fracbits + 1) {
			return;
		}
		else if (d < -(fracbits + 1)) {
			this.copyFrom(other);
			return;
		}
		boolean residue;
		BigFloat a;
		BigFloat b;
		if (d >= 0) {
			a = this;
			b = other;
		}
		else {
			d = -d;
			a = other;
			b = this;
		}

		// d <= 0 is ok.. no residue and right shift will become left shift
		residue = b.unscaled.getLowestSetBit() < d - 2;
		this.sign = a.sign;
		this.scale = a.scale - 2;
		BigInteger x = b.unscaled;
		x = x.shiftRight(d - 2);
		if (residue) {
			x = x.add(BigInteger.ONE);
		}

		this.unscaled = a.unscaled.shiftLeft(2).subtract(x);
		if (this.unscaled.signum() == 0) {
			this.sign = 1; // cancellation results in positive 0.
		}
		else if (this.unscaled.signum() < 0) {
			this.sign *= -1;
			this.unscaled = this.unscaled.negate();
		}
		scaleUpTo(fracbits + 1);
		internalRound(residue);
	}
{@code this-=other}

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