44 if(x1==NULL || x2==NULL || x3==NULL)
return(0);
47 if(a==0 && b==0 && c==0)
return(0);
48 if(!isfinite(a) || !isfinite(b) || !isfinite(c))
return(0);
50 long double q=(a*a - 3*b);
51 long double r=(2*a*a*a - 9*a*b + 27*c);
59 long double CR2=729*r*r;
60 long double CQ3=2916*q*q*q;
66 long double sqrtQ=sqrt(Q);
76 double ratio=copysign(sqrt(R2/Q3), R);
78 double theta=acos(ratio);
79 double norm=-2*sqrt(Q);
81 *x1=norm*cos(theta/3) - a/3;
82 *x2=norm*cos((theta + 2.0*M_PI)/3) - a/3;
83 *x3=norm*cos((theta - 2.0*M_PI)/3) - a/3;
84 if(*x1>*x2) {
double s=*x1; *x1=*x2; *x2=s;}
86 double s=*x2; *x2=*x3; *x3=s;
87 if(*x1>*x2) {
double s=*x1; *x1=*x2; *x2=s;}
91 long double A = -copysign(pow(fabsl(R) + sqrt(R2-Q3), 1.0/3.0), R);
int rootsCubic(const double a, const double b, const double c, double *x1, double *x2, double *x3)