235 if (fabs(
p1 - 1.0) > epsilon) {
237 const double q = (
a00 +
a11 +
a22) / 3.0;
239 const double p = sqrt(p2 / 6.0);
246 const double r = B.getDeterminant() / 2.0;
247 const double phi = (r < -1.0 ? PI / 3.0 : (r > 1.0 ? 0.0 : acos(r) / 3.0));
249 eigenvalues[0] = q + 2*p*cos(phi);
250 eigenvalues[2] = q + 2*p*cos(phi + 2*PI/3.0);
251 eigenvalues[1] = 3 * q - eigenvalues[0] - eigenvalues[2];
260 if (fabs(eigenvalues[0]) < fabs(eigenvalues[1])) {
261 swap(eigenvalues[0], eigenvalues[1]);
264 if (fabs(eigenvalues[1]) < fabs(eigenvalues[2])) {
266 swap(eigenvalues[1], eigenvalues[2]);
268 if (fabs(eigenvalues[0]) < fabs(eigenvalues[1])) {
269 swap(eigenvalues[0], eigenvalues[1]);