• Как обрезать число двойной точности?

    Fairek
    @Fairek Автор вопроса
    longclaps, не могу - надо завтра отчитываться по этому коду)))
    Вот программа, расписанная для одной точки (пары [x, y]):
    // x, y - числа типа double
    eps = 0.001
    x0 = max_of_array_x(); // не важно
    a1 = y;
    a2 = x;
    a3 = a1 / x0; // некое начальное значение, не важно
    
    do {
        f = a1 / (Math.Pow(Math.Pow(a3, 2.0) * (x0 - a2), 2.0) + 1.0);
        del = del - f;
    
        if (del < -eps)
        {
            a3 = a3 - eps;
        }
    } while (del >= -eps)


    Вопрос в тут именно в том, как доказать программе, что значения del = 0.001000123... и eps = 0.001 примерно равны.
  • Как обрезать число двойной точности?

    Fairek
    @Fairek Автор вопроса
    Прошу меня простить, сбился. Такое странное сравнение там специально, чтобы менять параметр a3 только в том случае, если рассчитанное число ушло в минус больше, чем на значение точности. Если это не так, то все нормально и можно просто переходить к следующей итерации, a3 менять не нужно.
  • Как обрезать число двойной точности?

    Fairek
    @Fairek Автор вопроса
    longclaps, я надеялся на "простой вопрос - простой ответ"...
    Вот код, который это обсчитывает:
    static private bool LorenzIteration(int iter)
            {
                bool flag = false;
                phi[iter] = 0;
                for (int i = 0; i < count; i++)
                { // a1i*/((a3i^2*(tn-a2i))^2+1)
    
                    // Расчет аппроксимирующей функции
                    f[iter][i] = a1[iter] / (Math.Pow(Math.Pow(a3[iter], 2.0) * (x0[i] - a2[iter]), 2.0) + 1.0);
                    // Расчет дельты для следующей итерации
                    del[iter + 1][i] = del[iter][i] - f[iter][i];
                    // Проверка на отрицательность
                    if (del[iter + 1][i] < -eps) //(DoubleCompare(del[iter + 1][i], -eps))
                    {
                        flag = true;
                    }
                }
                return flag;
            }

    Да, я понимаю, что сравнение, мягко говоря кривое, но я уже плохо помню, как правильно. Если не ошибаюсь, конкретно сравнение должно быть таким:
    Math.Abs(del[iter + 1][i]) < eps, верно?