* @param x
     * @param decimalPlacePrecision
     * @param aRoundingMode
     * @return
     */
    public static BigDecimal tan(
            BigDecimal x,
            Generic_BigDecimal a_Generic_BigDecimal,
            int decimalPlacePrecision,
            RoundingMode aRoundingMode) {
        BigDecimal sinx = sin(
                x,
                a_Generic_BigDecimal,
                decimalPlacePrecision + 10,
                aRoundingMode);
        sinx = Generic_BigDecimal.roundIfNecessary(
                sinx, 
                decimalPlacePrecision + 8,
                RoundingMode.DOWN);
        BigDecimal cosx = cos(
                x,
                a_Generic_BigDecimal, 
                decimalPlacePrecision + 10,
                aRoundingMode);
        cosx = Generic_BigDecimal.roundIfNecessary(
                cosx,
                decimalPlacePrecision + 8,
                RoundingMode.DOWN);
        if (cosx.compareTo(BigDecimal.ZERO) == 0) {
            return null;
        }
        BigDecimal tanx = Generic_BigDecimal.divideRoundIfNecessary(
                sinx,
                cosx,
                decimalPlacePrecision, 
                aRoundingMode);
        return tanx;
    }