40 unsigned int solveP3(
double a,
double b,
double c,
double *x)
43 double q = (a2 - 3 * b) / 9;
44 double r = (a * (2 * a2 - 9 * b) + 27 * c) / 54;
46 double q3 = q * q * q;
50 double t = r / sqrt(q3);
58 x[0] = q * cos(t / 3) - a;
59 x[1] = q * cos((t + M_2PI) / 3) - a;
60 x[2] = q * cos((t - M_2PI) / 3) - a;
65 A = -pow(fabs(r) + sqrt(r2 - q3), 1. / 3);
68 B = (0 == A ? 0 : q / A);
72 x[1] = -0.5 * (A + B) - a;
73 x[2] = 0.5 * sqrt(3.) * (A - B);
87 size_t solve_quartic(
const double &a,
const double &b,
const double &c,
const double &d,
double root[])
90 double b3 = a * c - 4. * d;
91 double c3 = -a * a * d - c * c + 4. * b * d;
99 unsigned int iZeroes = solveP3(a3, b3, c3, x3);
101 double q1, q2, p1, p2, D, sqD, y;
107 if (fabs(x3[1]) > fabs(y))
109 if (fabs(x3[2]) > fabs(y))
120 D = a * a - 4 * (b - y);
127 p1 = (a + sqD) * 0.5;
128 p2 = (a - sqD) * 0.5;
134 q1 = (y + sqD) * 0.5;
135 q2 = (y - sqD) * 0.5;
137 p1 = (a * q1 - c) / (q1 - q2);
138 p2 = (c - a * q2) / (q1 - q2);
142 D = p1 * p1 - 4 * q1;
147 root[rCnt] = (-p1 + sqD) * 0.5;
149 root[rCnt] = (-p1 - sqD) * 0.5;
154 D = p2 * p2 - 4 * q2;
158 root[rCnt] = (-p2 + sqD) * 0.5;
160 root[rCnt] = (-p2 - sqD) * 0.5;