使用卡尔丹公式
#include<bits/stdc++.h>
using namespace std;
#define eps 1e-6
struct cp{
double re,im;
cp(double x,double y){re=x;im=y;}
};
cp operator-(cp a){return cp(-a.re,-a.im);}
cp operator+(cp a,cp b){return (cp){a.re+b.re,a.im+b.im};}
cp operator-(cp a,cp b){return (cp){a.re-b.re,a.im-b.im};}
cp operator*(cp a,cp b){return (cp){a.re*b.re-a.im*b.im,a.im*b.re+a.re*b.im};}
cp operator/(cp a,cp b){
return (cp){(a.re*b.re+a.im*b.im)/(b.re*b.re+b.im*b.im),(a.im*b.re-a.re*b.im)/(b.re*b.re+b.im*b.im)};
}
cp operator+(double a,cp b){return (cp){a+b.re,b.im};}
cp operator-(double a,cp b){return (cp){a-b.re,b.im};}
cp operator*(double a,cp b){return (cp){a*b.re,a*b.im};}
cp operator/(double a,cp b){
return (cp){(a*b.re)/(b.re*b.re+b.im*b.im),(-a*b.im)/(b.re*b.re+b.im*b.im)};
}
cp operator+(cp a,double b){return (cp){a.re+b,a.im};}
cp operator-(cp a,double b){return (cp){a.re-b,a.im};}
cp operator*(cp a,double b){return (cp){a.re*b,a.im*b};}
cp operator/(cp a,double b){
return (cp){(a.re/b),(a.im/b)};
}
//以上重载运算符
double cpabs(cp x){return sqrt(x.re*x.re+x.im*x.im);}//模长
cp sqroot(cp x){//平方根
if(fabs(x.re)>eps&&fabs(x.im)<eps){
if(x.re<0)return cp(0,sqrt(-x.re));
else return cp(sqrt(x.re),0);
}else{
double im=sqrt(-0.5*x.re+sqrt(0.25*(x.re*x.re+x.im*x.im))),re=x.im/2/im;
return cp(re,im);
}
}
cp cuberoot(cp x){//立方根
if(fabs(x.im)<eps)return cp(pow(x.re,(1.0/3)),0);
double r=cpabs(x),a=atan(x.re/x.im);
r=pow(r,(1.0/3));a=a/3;
return cp(r*cos(a),r*sin(a));
}
cp w=cp(0.5,sqrt(3)/2),w2=cp(0.5,-sqrt(3)/2);
int main(){
double w,x,y,z;
scanf("%lf%lf%lf%lf",&w,&x,&y,&z);
cp a=cp(w,0),b=cp(x,0),c=cp(y,0),d=cp(z,0);
cp p=(3*a*c-b*b)/(3*a*a),q=(2*b*b*b+27*a*a*d-9*a*b*c)/(27*a*a*a);
cp delta=(q/2)*(q/2)+(p/3)*(p/3)*(p/3);
cp u=cuberoot(-q/2+sqroot(delta)),v=cuberoot(-q/2-sqroot(delta));
//printf("u=%.2lf+%.2lfi",u.re,u.im);
cp x1=u+v-b/(3*a),x2=w*u+w2*v-b/(3*a),x3=w2*u+w*b-b/(3*a);
double ans[3]={x1.re,x2.re,x3.re};
sort(ans,ans+3);
printf("%.2lf %.2lf %.2lf",ans[0],ans[1],ans[2]);
}