파이썬 원주율 구하기 - paisseon wonjuyul guhagi

아르키메데스는 96 각형을 직접 손으로 그려서 다각형의 둘레의 길이를 측정하였고, 원주율(π)이 3.14163이라고 계산하였다. 실제 값과 거의 차이가 나지 않았다.

아르키메데스가 96각형을 정확하게 작도하는데 들인 공과 시간을 생각해 보자. 컴퓨터의 힘을 빌린다면 96각형이 아니라 960 각형, 9600 각형도쉽게 계산할 수 있다.  

이제 파이썬 코딩을 통해서 아르키메데스의 발자취를 따라가 보자. 

1)  파이썬 내장 함수 이용

math 모듈을 import하면 원주율 내장함수 파이(pi)를 사용한다. math.pi로 불러서 계산식에 넣거나 출력 가능하다. 

import math

print(math.pi)

2)  아르키메데스의 수 

삼각함수 식을 이용하여 반지름이 1인 원에 내접하는 변과 외접하는 변의 길이를 구한다. 두 변의 길이 차이가 일정 오차범위 이하로 작아질 때까지 n각형을 반복문으로 구현한다. n이 커질수록 원에 가까워지는 성질을 이용한다. 

""" 원주율(파이) 계산하기 * 아르키메데스의 수 """
import math           # math 모듈 불러 오기

old_pi = 3.14163      # 아르키메데스가 96각형을 사용(n = 96)하여 계산한 원주율값
n = 5                 # 5각형부터 시작
err = 0.000000001          # 허용오차 십억분의 일

while True:
    degree = 360 / n      # n각형의 내각
    theta = degree / 2    # 내각의 절반이 삼각함수의 기준 각도(A)
    inner_length = math.sin(math.radians(theta)) * 2      # 내접하는 변의 길이 sin A * 2
    outer_length = math.tan(math.radians(theta)) * 2      # 외접하는 변의 길이 tan A * 2
    difference = outer_length - inner_length              # 내접하는 변과 외접하는 변의 길이 차이
    new_pi = n * ((outer_length + inner_length) / 2) /2   # 중간값으로 원주율 계산

    # n값 증가에 따른 원주율 값, 오차 변화
    print("n: ", n, "new_pi: ", new_pi)
    if (difference < err): 
        break                # 반복문 탈출
    else:
        n = n + 1            # 다각형의 변의 개수를 늘리기
        
# 아르키메데스의 원주율과 계산값 차이 비교
print("old_pi: ", old_pi, "new_pi: ", new_pi, "error: ", new_pi - old_pi)

# 파이썬 내장 원주율값(math.pi)와 비교
print("내장 원주율: ", math.pi, "차이: ", math.pi - new_pi)

허용오차 10억분의 1에서는 3142 각형을 만들었을 때, 반복문의 연산을 마치게 된다. 허용오차를 다른 값으로 주면서 n값과 원주율의 변화를 살펴본다. 

n:  3139 new_pi:  3.141592915822049
n:  3140 new_pi:  3.1415929156550484
n:  3141 new_pi:  3.141592915488207
n:  3142 new_pi:  3.1415929153215263
old_pi:  3.14163 new_pi:  3.1415929153215263 error:  -3.7084678473853216e-05
내장 원주율:  3.141592653589793 차이:  -2.6173173317545206e-07

원주율이란?

π = Pi = circumference / diameter = 3.14

구하는 방법

이집트나 바빌로니아에서 최초의 원주율을 바퀴를 직접 굴려 구했다고 한다.

우리가 잘 아는 기원은, 기원 전 250년 경 아르키메데스가 원에 내접 / 외접하는 96각형과 닮은 삼각형의 공식을 이용, 이의 둘레가 원의 둘레와 비슷할 것이라는 가정 하에 약 "3.14163"정도로 구한 것이다.

그 뒤엔 공식을 통해 원주율을 구하는 아주 다양한 방법이 나왔다. 밑의 두 개 링크 참조.

누가 뭐래도 나는 나무위키가 좋다 - namu.wiki/w/%EC%9B%90%EC%A3%BC%EC%9C%A8/%EC%97%AD%EC%82%AC

수학 관련 블로그 - www.mathscareers.org.uk/calculating-pi/

Calculating Pi (π) - Maths Careers

Pi is central to mathematics. Calculating pi can be achieved by different methods. Ancient and modern methods can be used to calculate PI

www.mathscareers.org.uk

파이썬 원주율 구하기 - paisseon wonjuyul guhagi

파이썬 구현

1. math.pi 사용

가장 쉬운 방법은 아무래도 Python의 math library에 있는 pi() function을 사용하는 것이겠다.

math library

docs.python.org/3/library/math.html

math — Mathematical functions — Python 3.9.1rc1 documentation

math — Mathematical functions This module provides access to the mathematical functions defined by the C standard. These functions cannot be used with complex numbers; use the functions of the same name from the cmath module if you require support for co

docs.python.org

import math

pi = str(math.pi)
num_digits = -1

while num_digits not in (0,15):
	num_digits = int(input("How many digits of PI do you want?: (0-15)"))
    print(pi[:num_digits+2])

노트

` 다만 math.pi로는 3.141592653589793 (소숫점 15자리) 까지만 나온다.

` Python float(실수)64비트 double-precision 베이스이고,

  base-2 fraction으로 1/2^n의 합으로 소숫점 자리들이 표시된다(*).

` 이에 해당하는 Significand precision / 부동 소숫점 / 유효숫자 비트는 53비트이기에(**),

  2^(-53) = 1.10 x 10^(-16), 15 - 17자리까지만 소숫점이 표시되는 것이다.

* www.geeksforgeeks.org/python-float-type-and-its-methods/

** en.wikipedia.org/wiki/Double-precision_floating-point_format

따라서 더 많은 소수자리수를 표시하기 위해서는 다른 알고리즘을 써야할 것이다.

2. mpmath 라이브러리 사용

검색하다가 찾게 되었다...!

소스코드 - stackoverflow.com/questions/9004789/1000-digits-of-pi-in-python

mpmathmpf (Real Float) 라는 Python의 built-in float과 비슷한 숫자형태를 제공한다.

mp라는 object로 정확도 / precision을 정하게 되는데, mp.prec으로는 binary precision을, mp.dps 로는 decimal (소숫점)one을 정할 수 있다.

mpmath documentation 참고 - mpmath.org.doc/current/basics.html

3. pi 구현 다른 알고리즘 사용

stackoverflow.com/questions/231767/what-does-the-yield-keyword-do

파이의 값은 다른 수학적 알고리즘으로도 구할 수 있다.

이 링크의 예시는 각 자릿수를 구하는 알고리즘을 통해, string list에 각 자릿수를 append하여 전체 파이값을 구한다.

그리고 결과값 (string list)를 출력!