문제

2 차 방정식을 사용하여 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를 얻을 수 있습니다.

글쎄, 나는 두 가지 질문을 생각합니다. 위의 내용을 더 잘 작성하고 복소수를 설명 할 수 있습니까?

도움을 주셔서 감사합니다!

도움이 되었습니까?

해결책

이와 같은 것이 효과가 있습니다.

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!

다른 팁

이 모든 것에 대한 중요한 메모. 이러한 응답과 원래 질문에 표시된 솔루션은 강력하지 않습니다.

잘 알려진 솔루션 (-B +-SQRT (B^2-4AC)) / 2A 계산에 비정규적인 것으로 알려져 있습니다 AC 매우 작습니다 b^2, 하나는 매우 유사한 두 가지 값을 빼기 때문에. 덜 알려진 솔루션을 사용하는 것이 좋습니다 2C / (-B-+ SQRT (B^2 -4AC)) 다른 뿌리를 위해.

강력한 솔루션은 다음과 같이 계산할 수 있습니다.

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

부호 (b)를 사용하면 두 가지 유사한 값을 빼지 않도록합니다.

OP의 경우 다른 포스터에서 표시된대로 복소수에 대해 이것을 수정하십시오.

당신은 어느 정도 그것을 가지고 있습니다. 제곱근 내부의 부품이 음수인지 확인한 다음 감축에서이를 별도로 추적하십시오.

기본적으로 만 사용할 수 있습니다 std::complex<float> 대신에 float 복소수를 지원합니다.

맹목적으로 아이디어를 새롭게 만들기 :

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

나는 'math.h'헤더를 사용하지 않고 프로그램을 시도했지만 다른 논리를 시도했지만 내 프로그램은 'x square'의 계수를 가진 2 차 방정식 만 ..... x의 계수만으로 대답 할 수 있습니다. '일정한 용어의 요인 인 두 숫자의 추가로 표현 될 수 있습니다. 예를 들어. 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();
                 }
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top