8

二次方程式を使用して X を解く関数を C++ で記述しようとしています。これは私が最初に書いたもので、答えに複素数がない限りうまくいくようです:

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;

たとえば、方程式 x^2 - x - 6 を使用すると、解 3, -2 が正しく得られます。

私の質問は、複素数をどのように説明するかです....たとえば、方程式が与えられた場合:

x^2 + 2x + 5

手で解くと、-1 + 2i、-1 - 2i になります。

さて、2 つの質問だと思いますが、上記をより適切に記述して、複素数を説明することはできますか?

助けてくれてありがとう!

4

6 に答える 6

7

次のようなものが機能します。

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;
}

そうすれば、実数と複素数の両方の結果に対して同様の方法で結果が得られます (実数の結果では、虚数部が 0 に設定されているだけです)。ブーストでさらにきれいに見えます!

編集: デルタの問題を修正し、a=0 のような縮退ケースのチェックを追加しました。眠れぬ夜ftl!

于 2009-05-22T14:26:54.000 に答える
4

多かれ少なかれそれを持っています。平方根の内側にある部分が負であるかどうかを確認し、それを削減で個別に追跡します。

于 2009-05-22T14:16:08.093 に答える
3

基本的に、複素数のサポートを取得するstd::complex<float>代わりに使用できます。float

于 2009-05-22T14:47:42.973 に答える
1

ブリンディからのアイデアにニックを入れる:

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)));
  }
}
于 2009-05-22T15:05:09.570 に答える
-1

「math.h」ヘッダーを使用せずにプログラムを試し、別のロジックも試しました...しかし、私のプログラムは、「x二乗」の係数を1つとして持つ二次方程式のみに答えることができます.....そして「xの係数」 ' は、定数項の因数である 2 つの数の加算として表すことができます。例えば。x スクエア +8x+16; x スクエア +7x+12; などここでは 8=4+4 & 16=4*4; ここで x の係数は、定数項 16 の因数である 2 つの数の加算として表すことができます。コードは;

        #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();
                 }
于 2012-11-01T09:13:49.747 に答える