fix solveCubic

The original solution did not handle correctly when delta = 0,
resulting as nan errors. I also wrote a test case to test solving
equation x^3 = 0 after fixing.
This commit is contained in:
Viet Dinh
2015-11-05 19:19:56 -05:00
parent 021ff0efa6
commit 68bcff26fb
2 changed files with 29 additions and 2 deletions

View File

@@ -2424,7 +2424,7 @@ int cv::solveCubic( InputArray _coeffs, OutputArray _roots )
double Qcubed = Q * Q * Q;
double d = Qcubed - R * R;
if( d >= 0 )
if( d > 0 )
{
double theta = acos(R / sqrt(Qcubed));
double sqrtQ = sqrt(Q);
@@ -2436,11 +2436,27 @@ int cv::solveCubic( InputArray _coeffs, OutputArray _roots )
x2 = t0 * cos(t1 + (4.*CV_PI/3)) - t2;
n = 3;
}
else if( d == 0)
{
if(R >= 0)
{
x0 = pow(R/4, 1./3) - a1/3;
x1 = -pow(2*R, 1./3) - a1/3;
}
else
{
x0 = -pow(-R/4, 1./3) - a1/3;
x1 = pow(-2*R, 1./3) - a1/3;
}
x2 = 0;
n = x0 == x1 ? 1 : 2;
x1 = x0 == x1 ? 0 : x1;
}
else
{
double e;
d = sqrt(-d);
e = pow(d + fabs(R), 0.333333333333);
e = pow(d + fabs(R), 1./3);
if( R > 0 )
e = -e;
x0 = (e + Q / e) - a1 * (1./3);