Saving a complex number in a variable

I am trying to perform this computation which results in a complex number. However, C++ gives me "NaN".

double Q, r, Theta;
Q=-0.043543950754930;
r=0.009124131609174;
Theta=acos(r/sqrt(pow(-Q,3))); 
// result must be (0.00000000000000 + 0.0911033580003565i)

Upvotes: 0

Views: 380

Answers (2)

Bob__
Bob__

Reputation: 12749

I am trying to perform this computation which results in a complex number.

All the variables in the posted snippet are of type double, so that the compiler has to use the overloads of std::acos, std::sqrt and std::pow accepting parameters of type double and returning double values.

In particular, the function double std::acos(double arg)[1]:

If a domain error occurs, an implementation-defined value is returned (NaN where supported).
[...]
Domain error occurs if arg is outside the range [-1.0, 1.0].

Given the values of R and Q in the posted example, the value of arg is greater than 1, causing a domain error.

To obtain a complex value, the OP should use (or cast to) variables of type std::complex<double>, so that the "correct" overloads of the mathematical functions are chosen, as well as the expected return type.

They could also implement different numerical algorithms (one for real, one for complex values) and let the program choose the right path based upon the value of some "discriminant" variable. E.g. a cubic equation has three complex solutions in general, but those can either be three different real values or three real values (two coincident) or one real value and two complex conjugate ones. A program might use different methods instead of a single general (all complex) one.


[1] Quotes from https://en.cppreference.com/w/cpp/numeric/math/acos, emphasis mine.

Upvotes: 0

Yun
Yun

Reputation: 3812

Yes, by using the std::complex type:

#include <complex>
#include <iostream>

int main()
{
    std::complex<double> Q = -0.043543950754930;
    std::complex<double> r = 0.009124131609174;
    std::complex<double> Theta = std::acos(r / std::sqrt(std::pow(-Q, 3)));
    std::cout << Theta << '\n';
}

Note that the complex functions return values in specific ranges. You may have to adjust for this if you are looking for a specific answer.

Upvotes: 5

Related Questions