Question

Je suis en train d'écrire une fonction en C ++ qui permet de résoudre pour X en utilisant l'équation quadratique. Voilà ce que je l'ai écrit d'abord, ce qui semble fonctionner tant qu'il n'y a pas de nombres complexes pour une réponse:

float solution1 = (float)(-1.0 * b) + (sqrt((b * b) - (4 * a * c)));
solution1 = solution1 / (2*a);

cout << "Solution 1: " << solution1 << endl;

float solution2 = (float)(-b) - (sqrt((b*b) - (4 * a * c)));
solution2 = solution2 / (2*a);
cout << "Solution 2: " << solution2;

Si, par exemple, j'utilise l'équation:. X ^ 2 - x - 6, je reçois la solution 3, -2 correctement

Ma question est de savoir comment devrais-je le nombres complexes .... par exemple, compte tenu de l'équation:

x ^ 2 + 2x + 5

Solving à la main, je recevrais -1 + 2i, -1 -. 2i

Eh bien, je suppose que deux questions, puis-je écrire ce qui précède mieux et aussi rendre compte du nombre complexe?

Merci pour toute aide!

Était-ce utile?

La solution

Quelque chose comme ça fonctionnerait:

struct complex { double r,i; }
struct pair<T> { T p1, p2; }

pair<complex> GetResults(double a, double b, double c)
{
  pair<complex> result={0};

  if(a<0.000001)    // ==0
  {
    if(b>0.000001)  // !=0
      result.p1.r=result.p2.r=-c/b;
    else
      if(c>0.00001) throw exception("no solutions");
    return result;
  }

  double delta=b*b-4*a*c;
  if(delta>=0)
  {
    result.p1.r=(-b-sqrt(delta))/2/a;
    result.p2.r=(-b+sqrt(delta))/2/a;
  }
  else
  {
    result.p1.r=result.p2.r=-b/2/a;
    result.p1.i=sqrt(-delta)/2/a;
    result.p2.i=-sqrt(-delta)/2/a;
  }

  return result;
}

De cette façon, vous obtenez les résultats d'une manière similaire pour les deux résultats réels et complexes (les résultats réels ont juste l'ensemble de la partie imaginaire à 0). Serait encore plus jolie avec boost!

edit: fixe pour la chose delta et a ajouté un chèque de cas dégénérés comme a = 0. FTL nuit sans sommeil!

Autres conseils

Une note importante à tout cela. Les solutions présentées dans ces réponses et la question initiale ne sont pas robustes.

La solution bien connue (- b + - sqrt (b ^ 2 - 4ac)) / 2a est connue pour être dans le calcul non robuste quand ac est très petit compered b ^ 2 , parce que l'on est deux valeurs très soustraction similaires. Il est préférable d'utiliser la solution moins connue 2c /. (-B - + sqrt (b ^ 2 -4ac)) pour l'autre racine

Une solution robuste peut être calculée comme suit:

temp = -0.5 * (b + sign(b) * sqrt(b*b - 4*a*c);
x1 = temp / a;
x2 = c / temp;

L'utilisation de signe (b) veille à ce que nous ne sommes pas deux valeurs similaires soustrayons.

Pour l'OP, modifier ce pour les nombres complexes comme le montrent d'autres affiches.

Vous avez plus ou moins, il suffit de vérifier si la partie qui est à l'intérieur de la racine carrée est négatif et garder une trace de cette part dans vos réductions.

Vous pouvez utiliser fondamentalement juste std::complex<float> au lieu de float pour obtenir de l'aide pour les nombres complexes.

entailler l'idée de Blindy:

typedef std::complex<double> complex;
using std::pair;
pair<complex> GetResults(double a, double b, double c)
{
  double delta=(b*b-4*a*c);
  double inv_2a = 1/2/a;
  if(delta >= 0) {
    double root = sqrt(delta);
    return std::make_pair(
        complex((-b-root)*inv_2a),
        complex((-b+root)*inv_2a);
  } else {
    double root = sqrt(-delta);
    return std::make_pair(
        complex(-b*inv_2a, -root*inv_2a)),
        complex(-b*inv_2a, +root*inv_2a)));
  }
}

J'ai essayé le programme sans utiliser la tête « math.h » et aussi essayé une logique différente ... mais mon programme peut répondre que les équations du second degré qui ont le coefficient de « x carré » comme l'un ..... et où le coefficient de « x » peut être exprimée en une addition de deux nombres qui sont des facteurs de terme constant. par exemple. x carré + 8x + 16;     x carré + 7x + 12; etc. ici 8 = 4 + 4 = 16 & 4 * 4; ici coefficient de x peut être exprimé en addition de deux nombres qui sont des facteurs de terme constant 16 ... Je me est pas entièrement satisfait mais essayé quelque chose de différent, sans utiliser la formule pour résoudre l'équation du second degré. code est;

        #include<iostream.h>
        #include<conio.h>
         class quadratic
              {
                int b,c ;
                float l,k;
                public:
               void solution();
              };
        void quadratic::solution()
             {
                 cout<<"Enter coefficient of x and the constant term of the quadratic eqn where coefficient of x square is one";
                 cin>>b>>c;

                 for(l=1;l<b;l++)
                  {
                   for(k=1;k<b;k++)
                    {
                     if(l+k==b&&l*k==c)
                        {
                          cout<<"x="<<-l<<"\t"<<"or"<<"\t"<<"x="<<-k;
                          cout<<"\n";
                         }
                    }
                }
            }
              void main()
                 {
                  quadratic a;
                   clrscr();
                  a.solution();
                  getch();
                 }
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top