소개
이 실험에서는 C 언어를 사용하여 수학 상수 e 를 그 급수 전개를 이용하여 근사하는 방법을 탐구합니다. e 의 급수는 계승의 역수의 합으로 정의됩니다: e = 1 + 1/1! + 1/2! + 1/3! + ... 먼저 이 급수 근사를 계산하는 C 프로그램을 만들고, 원하는 정확도 수준에 도달할 때까지 항을 합산하도록 수정할 것입니다. 이를 통해 계산의 정밀도를 제어하고 e 의 더 정확한 근사값을 얻을 수 있습니다.
이 실험에서는 C 언어를 사용하여 수학 상수 e 를 그 급수 전개를 이용하여 근사하는 방법을 탐구합니다. e 의 급수는 계승의 역수의 합으로 정의됩니다: e = 1 + 1/1! + 1/2! + 1/3! + ... 먼저 이 급수 근사를 계산하는 C 프로그램을 만들고, 원하는 정확도 수준에 도달할 때까지 항을 합산하도록 수정할 것입니다. 이를 통해 계산의 정밀도를 제어하고 e 의 더 정확한 근사값을 얻을 수 있습니다.
이 단계에서는 C 언어를 사용하여 수학 상수 e 를 그 급수 전개를 이용하여 근사하는 방법을 탐구합니다. e 의 급수는 계승의 역수의 합으로 정의됩니다: e = 1 + 1/1! + 1/2! + 1/3! + ...
먼저, 이 급수 근사를 계산하는 C 프로그램을 만들겠습니다. 프로젝트 디렉토리에 새 파일을 엽니다.
cd ~/project
nano e_approximation.c
이제 다음 C 코드를 입력합니다.
#include <stdio.h>
double factorial(int n) {
if (n == 0 || n == 1) return 1;
double result = 1;
for (int i = 2; i <= n; i++) {
result *= i;
}
return result;
}
double approximate_e(int terms) {
double e = 0;
for (int n = 0; n < terms; n++) {
e += 1.0 / factorial(n);
}
return e;
}
int main() {
int num_terms = 10;
double e_approximation = approximate_e(num_terms);
printf("Approximation of e with %d terms: %f\n", num_terms, e_approximation);
return 0;
}
이제 프로그램을 컴파일하고 실행합니다.
gcc e_approximation.c -o e_approximation
./e_approximation
예상 출력:
Approximation of e with 10 terms: 2.718282
이 단계에서는 원하는 정확도 수준에 도달할 때까지 항을 더하여 e 의 근사값을 계산하는 이전 프로그램을 수정합니다. 이 접근 방식을 통해 계산의 정밀도를 제어할 수 있습니다.
이전 C 파일을 업데이트합니다.
cd ~/project
nano e_approximation.c
이전 내용을 다음 개선된 코드로 바꿉니다.
#include <stdio.h>
#include <math.h>
double factorial(int n) {
if (n == 0 || n == 1) return 1;
double result = 1;
for (int i = 2; i <= n; i++) {
result *= i;
}
return result;
}
double approximate_e_with_accuracy(double desired_accuracy) {
double e = 0;
double term = 1;
int n = 0;
while (fabs(term) > desired_accuracy) {
e += term;
n++;
term = 1.0 / factorial(n);
}
return e;
}
int main() {
double accuracy = 1e-6; // 원하는 정확도 수준
double e_approximation = approximate_e_with_accuracy(accuracy);
printf("Approximation of e with accuracy %e: %f\n", accuracy, e_approximation);
printf("Standard math.h e 값: %f\n", M_E);
return 0;
}
업데이트된 프로그램을 컴파일하고 실행합니다.
gcc e_approximation.c -o e_approximation -lm
./e_approximation
예상 출력:
Approximation of e with accuracy 1.000000e-06: 2.718282
Standard math.h e 값: 2.718282
이 프로그램 버전은 다음 항이 지정된 정확도 임계값보다 작아질 때까지 급수에 항을 계속 추가합니다. fabs() 함수는 항의 절대값으로 작업하도록 합니다.
참고할 주요 사항:
1e-6을 사용합니다.이 마지막 단계에서는 다양한 정확도 수준으로 e 의 근사값을 출력하고 더 자세한 출력을 제공하도록 프로그램을 개선합니다.
C 파일을 한 번 더 업데이트합니다.
cd ~/project
nano e_approximation.c
이전 내용을 다음 포괄적인 코드로 바꿉니다.
#include <stdio.h>
#include <math.h>
double factorial(int n) {
if (n == 0 || n == 1) return 1;
double result = 1;
for (int i = 2; i <= n; i++) {
result *= i;
}
return result;
}
void print_e_approximations() {
double accuracies[] = {1e-1, 1e-3, 1e-6, 1e-9};
int num_accuracies = sizeof(accuracies) / sizeof(accuracies[0]);
printf("다양한 정확도 수준으로 e 근사값:\n");
printf("---------------------------------------------\n");
for (int i = 0; i < num_accuracies; i++) {
double e = 0;
double term = 1;
int n = 0;
int terms_used = 0;
while (fabs(term) > accuracies[i]) {
e += term;
n++;
term = 1.0 / factorial(n);
terms_used++;
}
printf("정확도: %e\n", accuracies[i]);
printf("근사값: %.10f\n", e);
printf("사용된 항의 개수: %d\n", terms_used);
printf("math.h e 와의 차이: %.10f\n\n", fabs(e - M_E));
}
}
int main() {
print_e_approximations();
return 0;
}
프로그램을 컴파일하고 실행합니다.
gcc e_approximation.c -o e_approximation -lm
./e_approximation
예상 출력:
다양한 정확도 수준으로 e 근사값:
---------------------------------------------
정확도: 1.000000e-01
근사값: 2.7000000000
사용된 항의 개수: 4
math.h e와의 차이: 0.0182818284
정확도: 1.000000e-03
근사값: 2.7182500000
사용된 항의 개수: 8
math.h e와의 차이: 0.0000318284
정확도: 1.000000e-06
근사값: 2.7182818000
사용된 항의 개수: 14
math.h e와의 차이: 0.0000000284
정확도: 1.000000e-09
근사값: 2.7182818285
사용된 항의 개수: 21
math.h e와의 차이: 0.0000000000
이 버전의 주요 개선 사항:
이 실험에서는 C 언어를 사용하여 수학 상수 e 의 급수 전개를 이용한 근사 계산 방법을 배웠습니다. 먼저 숫자의 팩토리얼을 계산하는 함수를 구현했고, 이를 사용하여 원하는 수의 항까지 급수의 항을 더하여 e 의 근사값을 계산했습니다. 그런 다음 원하는 정확도 수준에 도달할 때까지 항을 계속 더하도록 프로그램을 수정하여 계산의 정밀도를 제어할 수 있었습니다. 최종 프로그램은 원하는 정확도에 맞춰 e 의 근사값을 출력합니다.