docs: private static BigDecimal powInteger(BigDecimal x, BigDecimal integerY, MathContext mathContext) {
  		if (fractionalPart(integerY).signum() != 0) {
  			throw new IllegalArgumentException("Not integer value: " + integerY);
  		}
  		
  		if (integerY.signum() < 0) {
  			return ONE.divide(powInteger(x, integerY.negate(), mathContext), mathContext);
  		}
  
  		MathContext mc = new MathContext(Math.max(mathContext.getPrecision(), -integerY.scale()) + 30, mathContext.getRoundingMode());
  
  		BigDecimal result = ONE;
  		while (integerY.signum() > 0) {
  			BigDecimal halfY = integerY.divide(TWO, mc);
  
  			if (fractionalPart(halfY).signum() != 0) {
  				// odd exponent -> multiply result with x
  				result = result.multiply(x, mc);
  				integerY = integerY.subtract(ONE);
  				halfY = integerY.divide(TWO, mc);
  			}
  			
  			if (halfY.signum() > 0) {
  				// even exponent -> square x
  				x = x.multiply(x, mc);
  			}
  			
  			integerY = halfY;
  		}
  
  		return round(result, mathContext);
  	}