web-dev-qa-db-fra.com

C++ nombres complexes, quel est le bon format?

Je veux utiliser C++ avec des nombres complexes. Par conséquent, j'ai inclus #include <complex>. Maintenant, ma question est la suivante: comment déclarer une variable? (Quel est donc le format appelé, disons: 1 + i?) 

Merci d'avance :-)

15
user2649077
// 1 + 2i
std::complex<double> c(1, 2);
15
Antti Haapala

_ { Le constructeur de std::complex a deux paramètres: 

  • Le premier, qui a la partie réelle du nombre. 
  • La seconde, qui a la partie imaginaire du nombre.

Par exemple:

std::complex<float> my_complex(1,1); //1 + 1i 

De plus, C++ 11 introduit littéraux définis par l'utilisateur , ce qui nous permet d'implémenter (ou être implémenté par la bibliothèque standard, comme dans cette proposition acceptée par C++ 14 ) un littéral pour nombres complexes faciles à utiliser:

constexpr std::complex<float> operator"" i(float d)
{
    return std::complex<float>{0.0L,static_cast<float>( d )};
}

Vous pouvez utiliser ceci comme suit:

auto my_complex = 1i; // 0 + 1i
10
Manu343726

Essaye ça:

#include <complex>
#include <iostream>
using namespace std;
int main()
{
    complex<double> a = {1,2};
    complex<double> b(3,4);

    cout << a + b << "\n";
}
8
user2029077

Vous définissez une variable en spécifiant un paramètre de modèle et en spécifiant un nom pour la variable, à peu près comme avec la plupart des autres modèles:

std::complex<double> x(1, 1);

Le premier paramètre du ctor est la partie réelle, le second la partie imaginaire.

À partir de C++ 14, un opérateur littéral défini par l'utilisateur a été ajouté. Vous pouvez donc initialiser une variable complexe avec une notation un peu plus naturelle:

using namespace std::literals;

std::complex<double> c = 1.2 + 3.4i;

Dans ce cas, (évidemment assez) le 1.2 est la partie réelle et le 3.4 est la partie imaginaire. 

7
Jerry Coffin

Voici un exemple d'utilisation. Il compile et fonctionne sous QT

#include <QCoreApplication>
#include<complex>
#include<iostream>

using namespace std;

int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
std::complex<double> x=3.0-3.0i;
std::complex<double> y=2.0+4.0i;

cout.precision(3);
cout<<"x="<<x<<" y="<<y<<'\n';
cout<<" OR x real="<<real(x)<<" x imagine="<<imag(x)<<"\n\n";

complex<double> sum = x + y;
cout<<"The sum: x + y = "<<sum<<'\n';

complex<double> difference = x - y;
cout<<"The difference: x - y = "<<difference<<'\n';

complex<double> product = x * y;
cout<<"The product: XY = "<<product<<'\n';

complex<double> quotient = x / y;
cout<<"The quotient: x / y = "<<quotient<<'\n';

complex<double> conjugate = conj(x);
cout<<"The conjugate of x = "<<conjugate<<'\n';

complex<double> reciprocal = 1.0/x;
cout<<"The reciprocal of x = "<<reciprocal<<'\n';

complex<double> exponential =exp(x);
cout<<"The exponential  of x = "<<exponential<<'\n';

double magnitude=2.0,phase=45;
cout<<"magintude = "<<magnitude<<" phase = "<< phase<<" degrees\n";
complex<double> pol= std::polar(2.0,(M_PI/180.0)*phase);
cout<<"The polar: x , y = "<<pol<<'\n';

return a.exec();
}
0
vk3who