36 std::tuple<int, double, double>
44 return std::make_tuple(2, std::numeric_limits<double>::infinity(), -std::numeric_limits<double>::infinity());
46 return std::make_tuple(0, NAN, NAN);
49 return std::make_tuple(1, -c / b, NAN);
55 return std::make_tuple(2, 0, -b / a);
58 double disc, x1_real, x2_real ;
59 disc = b * b - 4 * a * c;
63 x1_real = (-b + sqrt(disc)) / (2 * a);
64 x2_real = (-b - sqrt(disc)) / (2 * a);
65 return std::make_tuple(2, x1_real, x2_real);
66 }
else if (disc == 0) {
68 x1_real = (-b + sqrt(disc)) / (2 * a);
69 return std::make_tuple(1, x1_real, NAN);
72 return std::make_tuple(0, NAN, NAN);
76 std::tuple<int, double, double, double>
85 return std::make_tuple(numX, x1, x2, NAN);
92 return std::make_tuple(numX + 1, 0, x1, x2);
99 double disc, q, r, dum1, s, t, term1, r13;
100 q = (3.0 * c - (b * b)) / 9.0;
101 r = -(27.0 * d) + b * (9.0 * c - 2.0 * (b * b));
103 disc = q * q * q + r * r;
106 double x1_real, x2_real, x3_real;
109 s = s < 0 ? -cbrt(-s) : cbrt(s);
111 t = t < 0 ? -cbrt(-t) : cbrt(t);
112 x1_real = -term1 + s + t;
113 term1 += (s + t) / 2.0;
114 x3_real = x2_real = -term1;
115 return std::make_tuple(1, x1_real, NAN, NAN);
118 else if (disc == 0) {
119 r13 = r < 0 ? -cbrt(-r) : cbrt(r);
120 x1_real = -term1 + 2.0 * r13;
121 x3_real = x2_real = -(r13 + term1);
122 return std::make_tuple(2, x1_real, x2_real, NAN);
128 dum1 = acos(r / sqrt(dum1));
130 x1_real = -term1 + r13 * cos(dum1 / 3.0);
131 x2_real = -term1 + r13 * cos((dum1 + 2.0 *
M_PI) / 3.0);
132 x3_real = -term1 + r13 * cos((dum1 + 4.0 *
M_PI) / 3.0);
133 return std::make_tuple(3, x1_real, x2_real, x3_real);
static std::tuple< int, double, double, double > cubicSolve(double a, double b, double c, double d)
Solver of cubic equation ax^3 + bx^2 + cx + d = 0.
static std::tuple< int, double, double > quadraticSolve(double a, double b, double c)
Solver of quadratic equation ax^2 + bx + c = 0.