protected static double dpow_default(double a, double b) {
		if (b < 0)
			return 1 / dpow_default(a, -b);
		double p = 1;
		int whole = (int) b;
		for (double v = a; whole > 0; whole >>= 1, v *= v)
			if ((whole & 1) != 0)
				p *= v;
		if ((b -= whole) > 0) {
			int frac = (int) (0x10000 * b);
			for (; (frac & 0xffff) != 0; frac <<= 1) {
				a = Math.sqrt(a);
				if ((frac & 0x8000) != 0)
					p *= a;
			}
		}
		return p;
	}