Объясните пожалуйста про машинный эпсилон

public static IList<double> Solve(double a, double b, double c)
    {
        const double eps = 0.00001;
        double discriminant = (b * b) - (4 * a * c);

        if (discriminant < -eps)
        {
            return null;
        }
        else if ((discriminant >= -eps) && (discriminant <= eps))
        {
            double x = (-b) / (2 * a);
            return new[] { x };
        }
        else
        {
            double x1 = (-b - Math.Sqrt(discriminant)) / (2 * a);
            double x2 = (-b + Math.Sqrt(discriminant)) / (2 * a);
            return new[] { x1, x2 };
        }
    }

Вот стандартный метод решения квадратного уравнения, с учетом точности вычисления. Такой вопрос, допустим мы взяли уравнение с такими коэффициентами, в которых дискриминант получается очень очень маленьким, и входит в рамки точности, т.е. мы его воспринимаем как ноль, и получаем одно решение(правильное). Но допустим, мы умножили все коэффициенты уравнения на очень большое число, корни не должны меняться, но вот дискриминант тогда получается большим, и уже мы его воспринимаем как >0. Но это не правильно получается. Как мне в таком случае рассчитывать эпсилон? Мне подсказали что тут нужен машинный эпсилон, я почитал, но не особо понял. Может кто-нибудь помощь в данной ситуации, как рассчитывать точность, если мне просто даны коэффициенты a,b,c?


Ответы (0 шт):