/// <summary>
        ///   Computes the area of the function under the selected <see cref="Range"/>.
        ///   The computed value will be available at this object's <see cref="Area"/>.
        /// </summary>
        ///
        /// <remarks>
        ///   If the integration method fails, the reason will be available at <see cref="Status"/>.
        /// </remarks>
        ///
        /// <returns>
        ///   True if the integration method succeeds, false otherwise.
        /// </returns>
        ///
        public bool Compute()
        {
            Status = InfiniteAdaptiveGaussKronrodStatus.Success;

            int errorCode;

            double a = this.Range.Min;
            double b = this.Range.Max;

            if (!Double.IsInfinity(a) && !Double.IsInfinity(b))
            {
                NonAdaptiveGaussKronrod.qng_(Function, a, b, ToleranceAbsolute, ToleranceRelative,
                                             out result, out error, out evaluations, out errorCode);
            }

            else
            {
                double bound = 0;
                int    inf;
                int    last;

                if (Double.IsInfinity(a) && Double.IsInfinity(b))
                {
                    inf = 2;
                }
                else if (Double.IsInfinity(a))
                {
                    bound = b;
                    inf   = -1;
                }
                else // if (Double.IsInfinity(b))
                {
                    bound = a;
                    inf   = 1;
                }

                qagi_(Function, bound, inf, ToleranceAbsolute, ToleranceRelative,
                      out result, out error, out evaluations, out errorCode,
                      limit, lenw, out last, iwork, work);
            }


            if (errorCode == 6)
            {
                throw new InvalidOperationException("Invalid inputs. If this error happens, the "
                                                    + "framework didn't check for inputs correctly. If you encounter this error, "
                                                    + "please feel in a bug report at the framework's issue tracking system.");
            }

            Status = (InfiniteAdaptiveGaussKronrodStatus)errorCode;

            return(Status == InfiniteAdaptiveGaussKronrodStatus.Success);
        }
        /// <summary>
        ///   Creates a new object that is a copy of the current instance.
        /// </summary>
        ///
        /// <returns>
        ///   A new object that is a copy of this instance.
        /// </returns>
        ///
        public object Clone()
        {
            NonAdaptiveGaussKronrod clone = new NonAdaptiveGaussKronrod(
                this.Function, this.Range.Min, this.Range.Max);

            clone.error             = error;
            clone.result            = result;
            clone.ToleranceAbsolute = ToleranceAbsolute;
            clone.ToleranceRelative = ToleranceRelative;

            return(clone);
        }
        /// <summary>
        ///   Computes the area of the function under the selected <see cref="Range"/>.
        ///   The computed value will be available at this object's <see cref="Area"/>.
        /// </summary>
        ///
        /// <remarks>
        ///   If the integration method fails, the reason will be available at <see cref="Status"/>.
        /// </remarks>
        ///
        /// <returns>
        ///   True if the integration method succeeds, false otherwise.
        /// </returns>
        ///
        public bool Compute()
        {
            Status = InfiniteAdaptiveGaussKronrodStatus.Success;

            int errorCode;

            double a = this.Range.Min;
            double b = this.Range.Max;

            if (!Double.IsInfinity(a) && !Double.IsInfinity(b))
            {
                NonAdaptiveGaussKronrod.qng_(Function, a, b, ToleranceAbsolute, ToleranceRelative,
                                             out result, out error, out evaluations, out errorCode);
            }

            else
            {
                double bound = 0;
                int    inf;
                int    last;

                if (Double.IsInfinity(a) && Double.IsInfinity(b))
                {
                    inf = 2;
                }
                else if (Double.IsInfinity(a))
                {
                    bound = b;
                    inf   = -1;
                }
                else // if (Double.IsInfinity(b))
                {
                    bound = a;
                    inf   = 1;
                }

                qagi_(Function, bound, inf, ToleranceAbsolute, ToleranceRelative,
                      out result, out error, out evaluations, out errorCode,
                      iwork.Length, work.Length, out last, iwork, work);
            }


            if (errorCode == 6)
            {
                throw new InvalidOperationException("Unexpected internal error code.");
            }

            Status = (InfiniteAdaptiveGaussKronrodStatus)errorCode;

            return(Status == InfiniteAdaptiveGaussKronrodStatus.Success);
        }