protected override IntegralValue Calculate()
        {
            //колличество узлов сетки на одном измерении
            int OneDimensionStepsAmount = (int)Math.Pow(N, 1/(double)F.NumArgs);
            if (OneDimensionStepsAmount == 0)
                OneDimensionStepsAmount++;

            double[] x = new double[F.NumArgs];
            int finish = (int)Math.Pow(OneDimensionStepsAmount, F.NumArgs);
            double sum = 0;

            for (int i = 0; i < finish; i++)
            {
                //Прекратить работу, если требуется завершение потока
                if (HaveToCancel()) break;

                int t = i;
                for (int j = 0; j < F.NumArgs; j++)
                {
                    x[j] = t % OneDimensionStepsAmount / (double)OneDimensionStepsAmount;
                    t /= OneDimensionStepsAmount;
                }

                sum += F.Calculate(x);
            }

            IntegralValue result = new IntegralValue(sum * Math.Pow(1 / (double)OneDimensionStepsAmount, F.NumArgs), 0);

            //Расчёт погрешности

            //Удваиваем колличество узлов
            int _OneDimensionStepsAmount = (int)Math.Pow(2*N, 1 / (double)F.NumArgs);
            if (_OneDimensionStepsAmount <= OneDimensionStepsAmount)
                _OneDimensionStepsAmount = OneDimensionStepsAmount - _OneDimensionStepsAmount + 1;
            OneDimensionStepsAmount = _OneDimensionStepsAmount;

            finish = (int)Math.Pow(OneDimensionStepsAmount, F.NumArgs);
            sum = 0;

            for (int i = 0; i < finish; i++)
            {
                //Прекратить работу, если требуется завершение потока
                if (HaveToCancel()) break;

                int t = i;
                for (int j = 0; j < F.NumArgs; j++)
                {
                    x[j] = t % OneDimensionStepsAmount / (double)OneDimensionStepsAmount;
                    t /= OneDimensionStepsAmount;
                }

                sum += F.Calculate(x);
            }

            result.Error = 10*Math.Abs(result.Value - sum * Math.Pow(1 / (double)OneDimensionStepsAmount, F.NumArgs));

            return result;
        }
 void bw_DoWork(object sender, DoWorkEventArgs e)
 {
     backgroundworkerResult = Calculate();
 }