* @param x
     * @param decimalPlacePrecision
     * @param aRoundingMode
     * @return
     */
    public static BigDecimal sin(
            BigDecimal x,
            Generic_BigDecimal a_Generic_BigDecimal,
            int decimalPlacePrecision,
            RoundingMode aRoundingMode) {
        BigDecimal aPI = a_Generic_BigDecimal.get_PI();
        BigDecimal twoPI = BigDecimal.valueOf(2).multiply(aPI);
        while (x.compareTo(BigDecimal.ZERO) == -1) {
            x = x.add(twoPI);
        }
        while (x.compareTo(twoPI) == 1) {
            x = x.subtract(twoPI);
        }
        // SpecialCases
        if (x.compareTo(BigDecimal.ZERO) == 0) {
            return BigDecimal.ZERO;
        }
        if (x.compareTo(aPI) == 0) {
            return BigDecimal.ZERO;
        }
        if (x.compareTo(twoPI) == 0) {
            return BigDecimal.ZERO;
        }
        BigDecimal aPIBy2 = Generic_BigDecimal.divideRoundIfNecessary(
                aPI,
                BigInteger.valueOf(2),
                decimalPlacePrecision + 2,
                aRoundingMode);
        return sinNoCaseCheck(
                x,
                aPI,
                twoPI,
                aPIBy2,
                a_Generic_BigDecimal,
                decimalPlacePrecision,
                aRoundingMode);
    }