我在这篇文章中提到了二次方程的复数根。 Solve Quadratic Equation in C++
所以,我使用OpenCV和std库在C ++中编写了类似的东西,但我总是得到NaN并且不知道为什么。
cv::Vec3f coefficients(1,-1,1);
cv::Vec<std::complex<float>,2> result_manual = {{0,0},{0,0}};
float c = coefficients.operator()(0);
float b = coefficients.operator()(1);
float a = coefficients.operator()(2);
std::cout << "---------manual method solving quadratic equation\n";
double delta;
delta = std::pow(b,2)-4*a*c;
if ( delta < 0) {
result_manual[0].real(-b/(2*a));
result_manual[1].real(-b/(2*a));
result_manual[0].imag((float)std::sqrt(delta)/(2*a));
result_manual[1].imag((float)-std::sqrt(delta)/(2*a));
}
else {
result_manual[0].real((float)(-b + std::sqrt(delta))/2*a);
result_manual[1].real((float)(-b - std::sqrt(delta))/2*a);
}
std::cout << result_manual[0] << std::endl;
std::cout << result_manual[1] << std::endl;
结果
---------manual method solving quadratic equation
(0.5,-nan)
(0.5,nan)
答案 0 :(得分:0)
在经过许多有用的评论之后回答自己只是为了完成。
问题中的链接是错误的实现,因为未定义负数的sqrt。正确的实施将是
result_manual[0].imag((float)-std::sqrt(std::abs(delta))/(2*a));
result_manual[1].imag((float)std::sqrt(std::abs(delta))/(2*a));