2017-09-05 89 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