Python3 Modules for number

Johnywhisky·2021년 7월 19일
0

TIL

목록 보기
4/9
post-thumbnail

Module

모듈(Module)은 하나의 파이썬 파일(.py)로 코드를 논리적으로 묶어서 관리하고 사용할 수 있도록 해주는 것이다. 이번 포스팅에서는 이전에 float type의 수는 소숫 점 밑 정확도에 신뢰도가 높지 않기 때문에 이와 관련된 높은 정확도를 요구하는 계산이나 test환경에서 사용할 수 있는 모듈과 수학과 관련된 총 세 개의 모듈을 알아보려고 한다.
기본적으로 모듈을 사용하기 위해서는 (일반적으로는)최 상단에 해당 모듈을 import 해준다.

import math # 모듈 전체를 임포트 하여 사용
# 또는
from math import ceil, floor, pi, e, ... # 모듈 내 특정 상수나 함수를 사용

1. math

먼저 math 모듈은 초월수, 초월함수, 삼각함수, 멱급수 등 고등학교 수학 시간에 배웠던 많은 함수들과 관련된 상수들을 쉽게 사용 할 수 있게 해주는 모듈이다. 대표적으로 지난 2차 프로젝트 진행 시 사용했던 pi가 있다.

import math
print(math.pi)                            # 결과: 3.141592653589793
print(math.sin(2*math.pi))                # 결과: -2.4492935982947064e-16
print("ceil(pi) :", math.ceil(math.pi))   # 결과: ceil(pi) : 4
print("floor(pi) :", math.floor(math.pi)) # 결과: floor(pi) : 3

결과를 보면 알 수 있듯이 함수의 return값은 float type의 수로 나오기 때문에 정확한 계산 값을 반환하지는 않지만 10의 -16승의 오차는 사실상 없다고 봐도 무방하지 않을까?

math.ceil : 올림 함수
math.floor : 내림 함수
math.trunc : 소수점 밑 버림 함수

반올림는 파이썬 자체에 내장되어있는 round 메소드를 활용하여 사용 가능하다.

2. fraction

fraction 모듈은 파이썬에서 수를 float type과 같은 소수를 사용하는 것이 아닌 분수를 다루는 모듈이다. 분수 간의 사칙연산 기능도 있다.

from fractions import Fraction
num1, num2, num3 = (3, 4, 1)

fraction1 = Fraction(num1, num2) # 결과 : 3/4
fraction2 = Fraction(num3, num2) # 결과 : 1/4

numerator   = fraction1.numerator # 분자를 반환, 결과 : 3
denominator = fraction1.denominator # 분모를 반환, 결과 : 4=

print(fraction1._add(fraction2)) # 분수 합, 결과 : 1
print(fraction1._mul(Fraction(1, fraction2))) # 결과 : 3

4. decimal

가장 높은 정확도를 가지는 decimal 모듈이다. 그렇기 때문에 계산이 필요 할 때 개인적으로 가장 선호하는 모듈이기도 하다. Decimal type의 수를 할당하는 세가지 방법이 있는데 각각 int, float, str type의 수를 대입하는 것이다. 하지만 float type 그대로를 대입할 때 이진법으로 나타내기 어려운 수는 내가 할당한 수와 다른 결과가 나올 수 있다는 이슈가 있으니 주의! 그렇기 때문에 str으로 변환하여 대입하는 걸 추천한다!

from decimal import Decimal

decimal_nums = [Decimal("1.25"), Decimal(4), Decimal(3.141592)]
for decimal_num in decimal_nums:
    print(decimal_num)
# 결과 : 1.25
#	4
#	3.14159200000000016217427400988526642322540283203125(??)

그리고 decimal type이 항상 정확하지는 않다. 예를 들어 자연상수를 밑으로 같는 지수함수를 계산할 때 재밌는 계산 결과가 나온다.

math_exp    = math.exp(math.log(2))    	 # 결과 : 2.0
decimal_exp = Decimal(math.log(2)).exp() # 결과 : 1.999999999999999953619063723
print(math_exp, decimal_exp)

decimal 모듈도 만능은 아니라는 뜻 같다.

즉, 어떤 모듈을 쓰든 컴퓨터는 필연적으로 오차를 가지기 때문에 상황에 맞는 place(유효자리 수)를 설정하고 계산하는게 가장 좋은 방법일 것이다.

profile
안녕하세요 :) 1년 차 Pythonist 백엔드 개발자 윤서준입니다.

0개의 댓글