Exemplo n.º 1
0
        private static DecimalX expTaylor(DecimalX x, int scale)
        {
            DecimalX sumPrev;

            var factorial = DecimalX.Create(1);
            var xPower    = x;

            // 1 + x
            var sum = x.Add(DecimalX.Create(1));

            // Loop until the sums converge
            // (two successive sums are equal after rounding).
            var i = 2;

            do
            {
                // x^i
                xPower = xPower.Multiply(x);
                xPower = DecimalX.Rescale(xPower, -scale, RoundingMode.HalfEven);

                // i!
                factorial = factorial.Multiply(DecimalX.Create(i));

                // x^i/i!
                var term = xPower.CDivide(factorial, scale, RoundingMode.HalfEven);

                // sum = sum + x^i/i!
                sumPrev = sum;
                sum     = sum.Add(term);

                i++;
            } while (sum.CompareTo(sumPrev) != 0);

            return(sum);
        }