public static long mult(long flongOne, long flongTwo)
			throws FixedPointLongException {
		boolean negative = false;
		long a = flongOne;
		long b = flongTwo;
		if (flongOne < 0) {
			a = -a;
			negative = !negative;
		}
		if (flongTwo < 0) {
			b = -b;
			negative = !negative;
		}
		long intmult = (a >> OFFSET) * (b >> OFFSET);
		if (intmult >> OFFSET != 0) {
			throw new FixedPointLongException("Numbers too large to multiply: "
					+ flongToString(flongOne) + ", " + flongToString(flongTwo));
		}
		long fracmult1 = (a >> OFFSET) * fracPart(b);
		long fracmult2 = (b >> OFFSET) * fracPart(a);
		long fracmult3 = (fracPart(a) >> 1) * (fracPart(b) >> 1);
		// System.err.println("intmult " + intmult + " fracmult1 " + fracmult1 +
		// " fracmult2 " + fracmult2 + " fracmult3 " + fracmult3);
		// System.err.println("fracpart1 " + fracPart(a) + " fracpart2 " +
		// fracPart(b) + " fracmult " + fracmult3);
		long ret = intToFlong((int) intmult) + fracmult1 + fracmult2
				+ (fracmult3 >> (OFFSET - 2));
		if (ret < 0)
			throw new FixedPointLongException(
					"Numbers are too large to multiply: "
							+ flongToString(flongOne) + ", "
							+ flongToString(flongTwo));
		if (negative)
			ret = -ret;
		// System.err.println("" + flongToString(flongOne) + " times " +
		// flongToString(flongTwo) + " is " + flongToString(ret));
		return ret;
	}