티스토리
PYTHON 소수점자리
Python에서 매우 큰 소수점 자리수를 정확하게 표현하기 위해서는 기본적인 float 타입 대신에 decimal 모듈의 Decimal 클래스를 사용할 수 있습니다. Decimal 클래스는 소수점 아래의 정확도를 유지하면서 연산을 수행할 수 있도록 설계되었으며, 특히 금융 계산과 같이 정밀한 소수 연산이 필요한 경우에 유용합니다.
먼저, decimal 모듈을 임포트하고, 정밀도를 설정할 수 있는 getcontext() 메서드를 사용하여 필요한 소수점 자리수를 설정합니다. 이후에 Decimal 객체를 생성하여 계산을 수행합니다.
1.코드리뷰
from decimal import Decimal, getcontext
# 필요한 소수점 자리수만큼 정밀도 설정
getcontext().prec = 200 # 예시로 200자리까지의 정밀도를 설정
# 매우 큰 소수점을 가진 숫자 표현 ( 실제 원주율 값이 아닌 임의의 숫자를 입력했습니다.)
pi = Decimal('3.1415926535897932384626433832795028841971693993751058209749445923078164062862089986280348253421170679')
pi = str(pi) # 문자열로 변환하여 문자 하나씩 카운트 하기 위함
# Decimal 객체를 사용한 계산 예시
value = 3 # 찾고자 하는 원하는 자릿수 3.14에서 '3', '.' 두개의 문자를 고려해서 입력
for i in range (3) : # range 3 은 0, 1, 2
print (f'{i}번째')
print (pi[i+2]) # 소숫점 3.14 에서 앞의 3과 .의 카운트 2번을 더해줌으로써 소수점자리 부터 출력
result = pi[4] # 리스트의 시작은 0번째부터 3.14 에서 0번째는 3 , 소숫점자리수는 2번째
print("결과값은? : ", result)
2. 코드리뷰 2
라이브러리 임포트: decimal 라이브러리를 임포트하고, 필요한 경우 Decimal 객체와 getcontext를 사용해 계산 정밀도를 설정합니다.
decimal.Decimal을 사용하면 더 정밀한 소수점 제어가 가능합니다. 특히 금융 계산에서 유용하게 사용됩니다.
아래 예제에서는 Decimal 객체의 quantize 메서드를 사용하여 소수점 이하 두 자리까지 반올림합니다. 각 방법은 상황에 따라 다르게 사용될 수 있습니다. round 함수는 간단한 반올림에 적합하고, format 함수나 문자열 포매팅은 출력 형식을 더 세밀하게 제어할 수 있습니다. Decimal 모듈은 정밀한 계산이 필요할 때 유리합니다. 사용자의 요구 사항과 상황에 맞는 방법을 선택하세요. |
from decimal import Decimal, ROUND_HALF_UP
number = Decimal('3.14159')
rounded_number = number.quantize(Decimal('.01'), rounding=ROUND_HALF_UP) # 3.14
계산 정밀도 설정: getcontext().prec를 사용하여 계산의 정밀도를 원주율의 소수점 이하 자릿수보다 높게 설정합니다. 여기서는 n번째 소수점 자리수 값을 원하기 때문에, 계산 정밀도를 n+1 이상으로 설정해야 합니다. 계산 과정에서 발생할 수 있는 반올림 오류를 최소화하기 위해 여유를 두고 약간 더 높은 값을 설정하는 것이 좋습니다.
원주율 계산: 원주율을 계산하는 여러 방법 중 하나를 선택합니다. decimal 라이브러리는 직접 원주율을 계산하는 기능을 제공하지 않으므로, 일반적으로 사용되는 원주율 계산 공식을 사용해야 합니다. 예를 들어, 라이프니츠 공식이나 체비쇼프의 공식 등이 있습니다. 이 예제에서는 간단한 방법을 사용할 것입니다.
결과 출력: 계산된 원주율 값에서 n번째 소수점 자리수를 추출하여 출력합니다.
추가 예제 코드 :
# decimal 라이브러리를 사용하여 고정밀도 연산을 수행
from decimal import Decimal, getcontext
# 원주율(pi) 계산을 위한 정밀도 설정 (300번째 소숫점 이상의 정확도 필요)
getcontext().prec = 305
# 원주율(pi) 계산에 사용될 라이프니츠 공식의 변형 또는 다른 방법을 구현
# 여기서는 예시를 위해 간단화된 접근 방법을 선택
# 참고: 실제 원주율 계산을 위해서는 BBP 공식 등 효율적인 알고리즘이 사용됨
pi_approx = sum(1/Decimal(16)**k *
(Decimal(4)/(8*k+1) - Decimal(2)/(8*k+4) -
Decimal(1)/(8*k+5) - Decimal(1)/(8*k+6)) for k in range(100))
# 원주율의 300번째 소숫점 자리수 추출
pi_300th_digit = str(pi_approx)[302]
print(pi_300th_digit)
마무리
- 이번 포스팅은 매우큰 소수점 자리수 처리에 대해 알아봤습니다.
궁금한 사항은 lution2@gmail.com로 문의사항 주시면 답변 드리겠습니다.
감사합니다.