mirror of
https://github.com/opencv/opencv.git
synced 2024-11-28 21:20:18 +08:00
Merge pull request #19583 from theroyalpekka:patch-1
* Update polynom_solver.cpp This pull request is in the response to Issue #19526. I have fixed the problem with the cube root calculation of 2*R. The Issue was in the usage of pow function with negative values of R, but if it is calculated for only positive values of R then changing x0 according to the parity of R, the Issue is resolved. Kindly consider it, Thanks! * add cv::cubeRoot(double) Co-authored-by: Alexander Alekhin <alexander.a.alekhin@gmail.com>
This commit is contained in:
parent
a1e2c4f338
commit
640f188ca2
@ -65,7 +65,8 @@ int solve_deg3(double a, double b, double c, double d,
|
||||
return 3;
|
||||
}
|
||||
else {
|
||||
x0 = pow(2 * R, 1 / 3.0) - b_a_3;
|
||||
double cube_root = cv::cubeRoot(2 * R);
|
||||
x0 = cube_root - b_a_3;
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
@ -82,8 +83,15 @@ int solve_deg3(double a, double b, double c, double d,
|
||||
}
|
||||
|
||||
// D > 0, only one real root
|
||||
double AD = pow(fabs(R) + sqrt(D), 1.0 / 3.0) * (R > 0 ? 1 : (R < 0 ? -1 : 0));
|
||||
double BD = (AD == 0) ? 0 : -Q / AD;
|
||||
double AD = 0.;
|
||||
double BD = 0.;
|
||||
double R_abs = fabs(R);
|
||||
if (R_abs > DBL_EPSILON)
|
||||
{
|
||||
AD = cv::cubeRoot(R_abs + sqrt(D));
|
||||
AD = (R >= 0) ? AD : -AD;
|
||||
BD = -Q / AD;
|
||||
}
|
||||
|
||||
// Calculate the only real root
|
||||
x0 = AD + BD - b_a_3;
|
||||
|
@ -587,6 +587,21 @@ _AccTp normInf(const _Tp* a, const _Tp* b, int n)
|
||||
*/
|
||||
CV_EXPORTS_W float cubeRoot(float val);
|
||||
|
||||
/** @overload
|
||||
|
||||
cubeRoot with argument of `double` type calls `std::cbrt(double)` (C++11) or falls back on `pow()` for C++98 compilation mode.
|
||||
*/
|
||||
static inline
|
||||
double cubeRoot(double val)
|
||||
{
|
||||
#ifdef CV_CXX11
|
||||
return std::cbrt(val);
|
||||
#else
|
||||
double v = pow(abs(val), 1/3.); // pow doesn't support negative inputs with fractional exponents
|
||||
return val >= 0 ? v : -v;
|
||||
#endif
|
||||
}
|
||||
|
||||
/** @brief Calculates the angle of a 2D vector in degrees.
|
||||
|
||||
The function fastAtan2 calculates the full-range angle of an input 2D vector. The angle is measured
|
||||
|
Loading…
Reference in New Issue
Block a user