0
我提到这个帖子是二次方程的复数根。因此,我使用OpenCV和std库编写了类似于C++的东西,但我总是得到NaN,不知道为什么。二次方根显示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)
只是一个猜测,但如果'delta'为负,'sqrt(delta)'将返回NaN,对吧? – PaulR
您需要检查增量是多少。如果它是负数,那么'sqrt'不会起作用 – NathanOliver
@NathanOliver:我在我的问题中发布的链接是对负数做一个sqrt并且它是一个可接受的答案。 – infoclogged