2017-09-05 93 views
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) 
+4

只是一个猜测,但如果'delta'为负,'sqrt(delta)'将返回NaN,对吧? – PaulR

+1

您需要检查增量是多少。如果它是负数,那么'sqrt'不会起作用 – NathanOliver

+0

@NathanOliver:我在我的问题中发布的链接是对负数做一个sqrt并且它是一个可接受的答案。 – infoclogged

回答

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)); 
+2

因为你的代码已经检查了delta是否为0,所以使用'(-delta)'与在已知的负数上调用'abs'相比更准确。 – franji1