Python 에서 Inf 와 Nan 의 판단 문제 에 대한 상세 한 설명

3363 단어 pythoninfnan
Python 에 서 는 다음 과 같은 방식 으로 플러스 와 마이너스 가 무한 하 다 는 것 을 잘 알 고 있 습 니 다.

float("inf") #    
float("-inf") #    
이용inf(infinite)에 0 을 곱 하면 얻 을 수 있다not-a-number(NaN).만약 하나의 수가 인 피 니 트 를 초과 한다 면,그것 은 하나의NaN(not a number)수 이다.NaN 수 에서 그의 exponent 부분 은 표현 가능 한 최대 치,즉 FF(단일 정밀도),7FF(이중 정밀도)와 7FFF(이중 정밀도 확장)입 니 다.NaN 수 와 infinite 수의 차 이 는 infinite 수의 significant 부분 은 0 값(두 정밀도 의 bit 63 위 를 1 로 확장)이다.반면 NaN 수의 significant 부분 은 0 값 이 아니다.
우 리 는 먼저 다음 과 같은 코드 를 봅 시다.

>>> inf = float("inf")
>>> ninf = float("-inf")
>>> nan = float("nan")
>>> inf is inf
True
>>> ninf is ninf
True
>>> nan is nan
True
>>> inf == inf
True
>>> ninf == ninf
True
>>> nan == nan
False
>>> inf is float("inf")
False
>>> ninf is float("-inf")
False
>>> nan is float("nan")
False
>>> inf == float("inf")
True
>>> ninf == float("-inf")
True
>>> nan == float("nan")
False
Python 에서 부동 소수점 이 NaN 인지 아 닌 지 를 판단 해 보지 않 았 다 면 이상 의 출력 결과 에 의아해 할 것 이다.우선,플러스 마이너스 무한 과 NaN 자체 와 자신 이 is 로 조작 한 결과 모두 True 이 고 여 기 는 문제 가 없 는 것 같 습 니 다.그러나==으로 조작 하면 결 과 는 달 라 졌 고,낸 은 이때 False 가 됐다.각각 float 로 변 수 를 다시 정의 하여 is 와==을 비교 하면 결 과 는 여전히 예상 밖 이다.이런 상황 이 발생 한 원인 은 약간 복잡 하 니,여 기 는 군더더기 가 없 으 니,관심 이 있 으 면 관련 자 료 를 찾 아 볼 수 있다.
inf 와 Nan 값 을 정확하게 판단 하려 면 math 모듈math.isinf math.isnan 함 수 를 사용 해 야 합 니 다.

>>> import math
>>> math.isinf(inf)
True
>>> math.isinf(ninf)
True
>>> math.isnan(nan)
True
>>> math.isinf(float("inf"))
True
>>> math.isinf(float("-inf"))
True
>>> math.isnan(float("nan"))
True
이렇게 하면 틀림없다.내 가 이 문 제 를 이야기 하고 있 는 이상 파 이 썬 에서 is 와==로 대상 이 플러스 마이너스 나 NaN 인지 아 닌 지 를 판단 하려 고 하지 말 라 고 충고 하 는 것 이다.너 는 순 순 히 math 모듈 을 사용 해라,그렇지 않 으 면 불 에 타 는 것 이다.
물론 다른 방법 으로 판단 할 수도 있 습 니 다.다음은 NaN 으로 예 를 들 지만 헷 갈 리 지 않도록 math 모듈 을 사용 하 는 것 을 추천 합 니 다.
대상 자체 로 자신 을 판단 하 다.

>>> def isnan(num):
...  return num != num
... 
>>> isnan(float("nan"))
True
numpy 모듈 함수 로

>>> import numpy as np
>>> 
>>> np.isnan(np.nan)
True
>>> np.isnan(float("nan"))
True
>>> np.isnan(float("inf"))
False
Numpy 의 isnan 함 수 는 전체 list 를 판단 할 수 있 습 니 다.

>>> lst = [1, float("nan"), 2, 3, np.nan, float("-inf"), 4, np.nan]
>>> lst
[1, nan, 2, 3, nan, -inf, 4, nan]
>>> np.isnan(lst)
array([False, True, False, False, True, False, False, True], dtype=bool)
여기np.isnan 는 불 값 배열 을 되 돌려 줍 니 다.해당 위치 가 NaN 이면 True 로 돌아 갑 니 다.그렇지 않 으 면 False 로 돌아 갑 니 다.
총결산
이상 은 이 글 의 전체 내용 입 니 다.본 논문 의 내용 이 여러분 의 학습 이나 업무 에 어느 정도 도움 이 되 기 를 바 랍 니 다.궁금 한 점 이 있 으 면 댓 글 을 남 겨 주 십시오.

좋은 웹페이지 즐겨찾기