64 double aover3(a / 3.0);
65 p = -(a * aover3) + b;
73 double dsqrt = std::sqrt(d);
74 u = std::cbrt(-q / 2.0 + dsqrt);
75 v = std::cbrt(-q / 2.0 - dsqrt);
76 res.x1 = u + v - aover3;
85 if(std::abs(d) <= 1e-20)
87 u = std::cbrt(-q / 2.0);
89 res.x1 = u + v - aover3;
96 alpha = std::atan(std::sqrt(-d) / -q * 2.0);
98 alpha = 2.0 * M_PI - alpha;
100 res.x1 = r * (std::cos((6.0 * M_PI - alpha) / 3.0) + std::cos(alpha / 3.0)) - aover3;
119 std::size_t polynome_size = polynome.size();
121 double a, b, c, delta;
123 switch(polynome_size)
149 delta = (b * b) - (a * c * 4);
154 else if(std::abs(delta) <= 1e-20)
156 res.x1 = -b / (a * 2);
163 delta = std::sqrt(delta);
164 res.x1 = (-b + delta) / (a * 2);
165 res.x2 = (-b - delta) / (a * 2);
172 cubic_solver(res, polynome[3], polynome[2], polynome[1], polynome[0]);