#include
using namespace std;
double a, b, c, d;
double x1, x2, x3,p,q;
double f(double x) { return a * x * x * x + b * x * x + c * x + d; }
double df(double x) { return 3 * a * x * x + 2 * b * x + c; }
//切线方程为y=f'(x0)(x-x0)+f(x0);
//令y=0 ——>x = x0 - f(x0) / f'(x0)
void bs(double l, double r)
{
double x=0, x0 = (l + r) / 2;//牛顿迭代法中,x0任意取,作为初始近似值,每次求出切线和此切线与x轴的交点,对此点(x,f(x))继续求切线,不断迭代。
while (fabs(x0 - x) > 1e-4)
x = x0 - f(x0) / df(x0), swap(x0, x);
//x0为上一次切线与X轴交点的横坐标
//x是由x0迭代求出的横坐标。每次swap,不断更新x0和x。不断迭代。
printf("%.2f ", x);
}
int main(){
cin >> a >> b >> c >> d;
p = (-b - sqrt(b * b - 3 * a * c)) / 3*a;//较小的极值点
q= (-b +sqrt(b * b - 3 * a * c)) / 3*a;//较大的极值点
bs(-100, p);
bs(p, q);
bs(q, 100);
return 0;
}