_빌런 2023. 8. 14. 20:21

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