우리가 도형에 대하여 계산이 필요한 경우 특히 원이나 포물선 등 곡선과 연관되면 원주율을 마주하게 됩니다. 파이썬에서 다양하게 원주율을 출력하는 방법들을 적어보려고 합니다.
1. 모듈을 이용하는 방법 (math, numpy)
import math
v_pi = math.pi
print(v_pi) #3.141592653589793
import numpy as np
v_pi = np.pi
print(v_pi) #3.141592653589793
먼저 파이썬에 있는 모듈을 이용하는 방법입니다. 두 모듈은 수학 관련으로 자주 사용되는 모듈로 π가 상수로 저장되어 있습니다. 일반적인 수치 계산에서 충분하게 사용할 수 있습니다.
2. 수학적 공식을 이용하는 방법
2-1. 라이프니츠 급수 이용하는 방법
이미지 출처 : 위키피디아
π를 직접 구하는 여러 가지 공식이 있으나 대표적으로 사용되는 공식으로 라이프니츠 급수가 있습니다. 위 식에서 4를 곱하면 π 값을 얻을 수 있습니다. Python 코드로 표현하면 아래와 같은 코드로 나타낼 수 있습니다.
def calc_pi(n_terms):
pi_result = 0
for k in range(n_terms):
pi_result += (-1) ** k / (2 * k + 1)
return 4 * pi_result
pi_value = calc_pi(1000000)
print(pi_value) #3.1415916535897743
여기에서 결과는 실제 π 값과 오차를 가지고 있습니다.
결 과 : 3.1415916535897743
실제 값 : 3.1415926535897932
n_terms의 값이 무한대인 경우 π의 값이 더 정확해지지만, 무한히 많은 값을 사용할 수 없으므로 어느 정도 오차가 발생합니다.
2-2. BBP 공식을 활용하는 방법
이미지 출처 : 위키피디아
BBP 공식은 1996년 데이빗 베일리는 피터 보어와인, 시몽 플루프와 공동으로 π에 관련된 새로운 무한급수입니다. 해당 공식은 π를 16진수로 계산하는 방법 하나로, 특정 자리까지의 값을 직접 계산할 수 있습니다.
공식을 이용하여 소수점 100자리까지 구하는 Python 코드는 다음과 같습니다:
import decimal
from decimal import Decimal, getcontext
# 소수점 이하 100자리 설정
getcontext().prec = 102 # 계산 과정에서 오차를 줄이기 위해 약간 더 크게 설정
# Bailey–Borwein–Plouffe (BBP) 공식 사용
def calc_pi():
pi = Decimal(0)
exp_16 = Decimal(1) # 16^0 초기값은 1
for k in range(100):
pi += exp_16 * (
Decimal(4) / (8*k + 1) -
Decimal(2) / (8*k + 4) -
Decimal(1) / (8*k + 5) -
Decimal(1) / (8*k + 6)
)
exp_16 /= Decimal(16) # 16^k를 다음 단계의 16^(k+1)로 업데이트
return pi
pi_value = calc_pi()
# 소수점 이하 100자리까지 출력
print(f"{pi_value:.100f}")
#3.1415926535897932384626433832795028841971693993751058209749445923078164062862089986280348253421170680
인프라의 한계
우리가 일반적으로 1억 이상 큰 수를 구한다고 한다면 가정용 컴퓨터의 사양으로 계산하기에 한계가 있습니다. 복잡한 수학적 알고리즘이나 높은 정밀도의 π 값을 계산할 때는 컴퓨터의 성능이 중요합니다. 많은 자리까지 정확히 계산하기 위해서는 클라우드 환경의 클러스터 PC나 GPU를 활용하는 것이 필요할 수 있습니다. 이러한 작업은 계산 자원이 많이 소모되므로, 효율적인 알고리즘 선택과 자원 관리 또한 중요합니다.
마지막으로
최근에 일반 사용자도 10억 이상의 파이값을 출력하는 것이 가능하냐고 생각을 하고 테스트를 해보고 있습니다. 나중에 완성된다면 해당 이야기도 풀어보려고 합니다.
도움이 된 게시글
https://post.naver.com/viewer/postView.nhn?volumeNo=28129380&memberNo=5565159
https://m.dongascience.com/news.php?idx=58906
https://wiki.mathnt.net/index.php?title=%EC%9B%90%EC%A3%BC%EC%9C%A8(%ED%8C%8C%EC%9D%B4,%CF%80)
'컴퓨터 > Python' 카테고리의 다른 글
Python (26) - Flask를 활용하여 웹서버를 만들어보자 (0) | 2024.11.07 |
---|---|
Python (24) - 파이썬으로 MySQL 다루기 (PyMySQL) (0) | 2024.06.08 |
Python (23) - 오라클과 연동하여 Blob이미지를 다운로드 해보자 (oracledb) (0) | 2024.03.26 |
Python (22) - 로또 API이용하여 당첨번호를 크롤링해보자 (1) | 2024.01.29 |
Python (21) - 파이썬을 이용하여 Beep로 연주하기 (winsound) (2) | 2023.10.17 |