Computer >> 컴퓨터 >  >> 프로그래밍 >> C 프로그래밍

C 언어로 이차 방정식의 근 구하기: 판별식을 활용한 완벽 가이드

이번 튜토리얼에서는 C 언어를 사용하여 이차 방정식의 근(해)을 구하는 프로그램을 다룹니다.

일반적인 이차 방정식은 다음과 같은 형태로 표현됩니다.

ax² + bx + c = 0

여기서 우리의 목표는 주어진 방정식의 두 근 x1과 x2를 찾는 것입니다.

이차 방정식의 해법 원리

이 문제는 결정론적(deterministic) 방법인 근의 공식을 사용하여 해결할 수 있습니다. 먼저 판별식 D를 계산합니다.

D = √(b² − 4ac)

그런 다음 판별식 값을 이용하여 두 근을 다음과 같이 구합니다.

x1 = (−b + D) / 2a

x2 = (−b − D) / 2a

판별식 값에 따른 세 가지 경우

  • D > 0: 서로 다른 두 실근을 가집니다.
  • D = 0: 중근(같은 실근 하나)을 가집니다.
  • D < 0: 실수 범위에서 해가 없으며, 허수를 포함한 켤레복소수 형태의 두 복소근을 가집니다.

C 코드 예제

#include<stdio.h>
#include<math.h>
#include<stdlib.h>

// 방정식의 근을 계산하는 함수
void calc_roots(int a, int b, int c) {
    if (a == 0) {
        printf("Invalid Equation");
        return;
    }
    int d = b*b - 4*a*c;
    double sqrt_val = sqrt(abs(d));
    if (d > 0) {
        printf("Roots are both real and different \n");
        printf("%f\n%f",(double)(-b + sqrt_val)/(2*a) , (double)(-b - sqrt_val)/(2*a));
    }
    else if (d == 0) {
        printf("Roots are real and same \n");
        printf("%f",-(double)b / (2*a));
    } else {
        printf("Roots are complex \n");
        printf("%f + i%f\n%f - i%f", -(double)b /(2*a),sqrt_val ,-(double)b / (2*a), sqrt_val);
    }
}

int main() {
    int a = 2, b = -5, c = 8;
    calc_roots(a, b, c);
    return 0;
}

실행 결과

Roots are complex
1.250000 + i6.244998
1.250000 - i6.244998

코드 설명

위 프로그램의 동작 과정을 단계별로 살펴보겠습니다.

  1. 유효성 검사: 계수 a가 0이면 이차 방정식이 아니므로 "Invalid Equation"을 출력하고 함수를 종료합니다.
  2. 판별식 계산: d = b² − 4ac 공식으로 판별식을 구하고, 제곱근 값을 미리 계산해 둡니다.
  3. 경우에 따른 분기 처리: d가 양수이면 서로 다른 두 실근, 0이면 중근, 음수이면 실수부와 허수부로 이루어진 켤레복소근을 출력합니다.

예제에서 사용된 방정식 2x² − 5x + 8 = 0의 경우 판별식이 음수이므로, 실수부 1.25와 허수부 약 ±6.245를 갖는 두 개의 복소근이 출력됩니다.

마무리

이처럼 C 언어에서는 sqrt() 함수와 조건문만으로 이차 방정식의 모든 유형의 근(실근, 중근, 복소근)을 손쉽게 구할 수 있습니다. 부동소수점 연산 시 정확도를 위해 정수형 계수를 double로 형 변환하는 점도 눈여겨볼 만합니다.