Объясните пожалуйста про машинный эпсилон
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?