/// <summary>
        /// Construct a solver with given accuracies.
        /// </summary>
        /// <param name="relativeAccuracy"> Maximum relative error. </param>
        /// <param name="absoluteAccuracy"> Maximum absolute error. </param>
        /// <param name="functionValueAccuracy"> Maximum function value error. </param>
//JAVA TO C# CONVERTER WARNING: 'final' parameters are not available in .NET:
//ORIGINAL LINE: protected BaseAbstractUnivariateSolver(final double relativeAccuracy, final double absoluteAccuracy, final double functionValueAccuracy)
        protected internal BaseAbstractUnivariateSolver(double relativeAccuracy, double absoluteAccuracy, double functionValueAccuracy)
        {
            this.absoluteAccuracy      = absoluteAccuracy;
            this.relativeAccuracy      = relativeAccuracy;
            this.functionValueAccuracy = functionValueAccuracy;
            this.evaluations           = IntegerSequence.Incrementor.Create();
        }
        /// <summary>
        /// Prepare for computation.
        /// Subclasses must call this method if they override any of the
        /// {@code solve} methods.
        /// </summary>
        /// <param name="f"> Function to solve. </param>
        /// <param name="min"> Lower bound for the interval. </param>
        /// <param name="max"> Upper bound for the interval. </param>
        /// <param name="startValue"> Start value to use. </param>
        /// <param name="maxEval"> Maximum number of evaluations. </param>
        /// <exception cref="NullArgumentException"> if f is null </exception>
        protected internal virtual void Setup(int maxEval, FUNC f, double min, double max, double startValue)
        {
            // Checks.
            MathUtils.CheckNotNull(f);

            // Reset.
            searchMin   = min;
            searchMax   = max;
            searchStart = startValue;
            function    = f;
            evaluations = evaluations.WithMaximalCount(maxEval).withStart(0);
        }