이번 튜토리얼에서는 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
코드 설명
위 프로그램의 동작 과정을 단계별로 살펴보겠습니다.
- 유효성 검사: 계수 a가 0이면 이차 방정식이 아니므로 "Invalid Equation"을 출력하고 함수를 종료합니다.
- 판별식 계산: d = b² − 4ac 공식으로 판별식을 구하고, 제곱근 값을 미리 계산해 둡니다.
- 경우에 따른 분기 처리: d가 양수이면 서로 다른 두 실근, 0이면 중근, 음수이면 실수부와 허수부로 이루어진 켤레복소근을 출력합니다.
예제에서 사용된 방정식 2x² − 5x + 8 = 0의 경우 판별식이 음수이므로, 실수부 1.25와 허수부 약 ±6.245를 갖는 두 개의 복소근이 출력됩니다.
마무리
이처럼 C 언어에서는 sqrt() 함수와 조건문만으로 이차 방정식의 모든 유형의 근(실근, 중근, 복소근)을 손쉽게 구할 수 있습니다. 부동소수점 연산 시 정확도를 위해 정수형 계수를 double로 형 변환하는 점도 눈여겨볼 만합니다.