C 언어로 e 상수 급수 근사 계산

CBeginner
지금 연습하기

소개

이 실험에서는 C 언어를 사용하여 수학 상수 e 를 그 급수 전개를 이용하여 근사하는 방법을 탐구합니다. e 의 급수는 계승의 역수의 합으로 정의됩니다: e = 1 + 1/1! + 1/2! + 1/3! + ... 먼저 이 급수 근사를 계산하는 C 프로그램을 만들고, 원하는 정확도 수준에 도달할 때까지 항을 합산하도록 수정할 것입니다. 이를 통해 계산의 정밀도를 제어하고 e 의 더 정확한 근사값을 얻을 수 있습니다.

e = ∑(1/n!) 사용

이 단계에서는 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을 사용합니다.
  • 프로그램은 필요한 항의 개수를 동적으로 결정합니다.
  • 표준 math 라이브러리의 e 값과 근사값을 비교합니다.

근사값 출력

이 마지막 단계에서는 다양한 정확도 수준으로 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

이 버전의 주요 개선 사항:

  • 여러 정확도 수준에서 근사값을 출력합니다.
  • 각 근사값에 사용된 항의 개수를 표시합니다.
  • 표준 math 라이브러리의 e 값과의 차이를 계산하고 표시합니다.

요약

이 실험에서는 C 언어를 사용하여 수학 상수 e 의 급수 전개를 이용한 근사 계산 방법을 배웠습니다. 먼저 숫자의 팩토리얼을 계산하는 함수를 구현했고, 이를 사용하여 원하는 수의 항까지 급수의 항을 더하여 e 의 근사값을 계산했습니다. 그런 다음 원하는 정확도 수준에 도달할 때까지 항을 계속 더하도록 프로그램을 수정하여 계산의 정밀도를 제어할 수 있었습니다. 최종 프로그램은 원하는 정확도에 맞춰 e 의 근사값을 출력합니다.