Python inf
PS를 하든, 알고리즘을 구상하든 최솟값과 최댓값이 필요한 경우가 있다.
그럴 때 1e9와 같은 큰 수를 사용하기도 하지만, 경우에 따라 무한대가 필요하기도 하다.
Python3에는 inf를 표현하는 여러 가지 방법들이 있다.
pos_inf = float("inf") # inf
neg_int = float("-inf") # -inf
int_inf = int("inf")
# ValueError: invalid literal for int() with base 10: 'inf'
int_inf = int(float("inf"))
# OverflowError: cannot convert float infinity to integer
float 내장 함수 기능을 사용한다. 일반적으로 가장 많이 사용하는 방법이다.
음의 무한대를 저장할 때, float("-inf")가 아니라 -float("inf")로 저장해도 상관없다.
float 함수에서 제공하는 기능으로 int 함수로는 사용이 불가능하다.
int로 감쌀 경우, OverflowError가 뜰 수도 있고, 애초에 사용 불가능하여 ValueError가 뜰 수도 있다.
INF = 1e400 # inf
isINF_1 = 1e308 # is not inf
isINF_2 = 1e309 # is inf
충분히 큰 값 Var가 있다고 해보자.
놀랍게도 IEEE 754에 의해 1e{Var}는 inf으로 취급한다. 즉 float("inf")와 1e400은 같은 값로 취급한다는 이야기이다.
어디를 기준으로 inf로 인식할까 테스트 해보았다. Python3에서는 1e308은 1e+308로, 1e309는 inf를 출력한다.
import math
pos_inf = math.inf # inf
neg_inf = -math.inf # -inf
Mathematical Function 방법이다. 쉽게 말해 math 라이브러리를 사용한다.
해당 방법은 Python 3.5 이상 버전에서만 사용 가능하다.
from decimal import Decimal
pos_inf = Decimal("inf") # Infinity
neg_inf = Decimal("-inf") # -Infinity
float 자료형보다 정확하게 실수를 표현하기 위해 사용하는 Decimal(십진법) 모듈이다.
└ https://docs.python.org/3/library/decimal.html
float와 동일하게 Decimal("-inf")로 적든, -Decimal("inf")로 적든 상관없다.
특이한 점은 inf가 아니라 Infinity를 return한다는 점이다.
import sys
int_pos_inf = sys.maxsize # 922_3372_0368_5477_5807
int_neg_inf = -(sys.maxsize + 1) # -922_3372_0368_5477_5808
Python3에서 float가 아니라 int 타입으로 무한대를 사용하고 싶을 때 사용한다.
무한대가 아니라 무지하게 큰 수이기는 하지만 말이다.
음의 무한대의 범위를 정확하게 할 필요가 없다면, 굳이 1을 더해주지 않아도 상관없다.
약 900경에 해당하는 수가 나오게 된 계기는 sys.maxsize이다. sys.maxsize는 해당 플랫폼의 포인터 사이즈를 return한다.
└ 문자열이나 리스트 등의 구조 길이 제한을 위한 값이다.
└ https://stackoverflow.com/questions/6918291/how-to-determine-word-size-in-python/6918334#6918334
32bit라면 2 ** 31 - 1, 64bit라면 2 ** 63 - 1이다. 계산기를 두드리면 동일함을 알 수 있다.
import math
math.isinf(something) # True / False
마지막으로 어떤 값이 무한인지 아닌지 확인하기 위해서 math 라이브러리를 사용한다.
math.isinf() 함수를 사용하여, bool 타입으로 return해준다. Python 2.6 버전부터 사용 가능한 기능이다.
고민을 시작한 문제 출처 : https://shoark7.github.io/programming/algorithm/introduction-to-tsp-and-solve-with-exhasutive-search
참고한 문서 자료 : https://docs.python.org/3/library/decimal.html
참고한 문서 자료 : https://peps.python.org/pep-0754/
참고한 웹 사이트 : https://stackoverflow.com/questions/6918291/how-to-determine-word-size-in-python/6918334#6918334
참고한 웹 사이트 : https://stackoverflow.com/questions/24587994/infinite-integer-in-python
참고한 웹 사이트 : https://brownbears.tistory.com/549
참고한 웹 사이트 : https://da-nyee.github.io/posts/python-infinity/
참고한 웹 사이트 : https://shydev.tistory.com/9