public static double CalculateLagrangeRemainder(Expr function, string variableName, int n, FloatingPoint x, FloatingPoint x0)
        {
            var results = new List <double>();

            var    length           = GetLength(Math.Min(x.RealValue, x0.RealValue), Math.Max(x.RealValue, x0.RealValue));
            var    increment        = length / 10;
            double currentIncrement = Math.Min(x.RealValue, x0.RealValue);

            var factorial = (FloatingPoint)SpecialFunctions.Factorial(n + 1);

            while (currentIncrement < Math.Max(x.RealValue, x0.RealValue))
            {
                var variable = new Dictionary <string, FloatingPoint>
                {
                    { variableName, currentIncrement }
                };

                var derivativeResult = function.CalculateFunctionAtDerivative(variable, Expr.Variable(variableName), n + 1);
                var result           = derivativeResult.RealValue / factorial.RealValue * Math.Pow(Math.Abs(x.RealValue - x0.RealValue), n + 1);
                results.Add(Math.Abs(result));
                currentIncrement += increment;
            }

            var variableMax = new Dictionary <string, FloatingPoint>
            {
                { variableName, Math.Max(x.RealValue, x0.RealValue) }
            };

            var derivativeResultMax = function.CalculateFunctionAtDerivative(variableMax, Expr.Variable(variableName), n + 1);
            var resultMax           = derivativeResultMax.RealValue / factorial.RealValue * Math.Pow(Math.Abs(x.RealValue - x0.RealValue), n + 1);

            results.Add(Math.Abs(resultMax));

            return(results.Max(x => x));
        }