특정 종류의 부동소수점(float)이 어느 정도의 소수 자릿수까지 정밀하게 값을 표현할 수 있는지 알아내려면, Python NumPy에서 제공하는 numpy.finfo() 메서드의 precision 속성을 사용하면 됩니다. finfo() 함수의 첫 번째 매개변수는 정보를 조회하고자 하는 부동소수점 데이터 타입입니다.
주요 속성 살펴보기
- precision – 해당 float 타입이 정밀하게 표현할 수 있는 대략적인 소수 자릿수
- iexp – 지수부(exponent)에 할당된 비트 수
- min – 해당 dtype이 표현할 수 있는 최솟값
- max – 해당 dtype이 표현할 수 있는 최댓값
단계별 실행 방법
먼저 필요한 라이브러리를 임포트합니다.
import numpy as np
1) float16 타입 확인하기
a = np.finfo(np.float16(45.976))
print("대략적인 소수 자릿수(정밀도)...\n", a.precision)
print("지수부 비트 수...\n", a.iexp)
print("float16의 최솟값...\n", a.min)
print("float16의 최댓값...\n", a.max)
2) float32 타입 확인하기
b = np.finfo(np.float32(22.3))
print("\n대략적인 소수 자릿수(정밀도)...\n", b.precision)
print("지수부 비트 수...\n", b.iexp)
print("float32의 최솟값...\n", b.min)
print("float32의 최댓값...\n", b.max)
3) float64 타입 확인하기
c = np.finfo(np.float64(29.2))
print("\n대략적인 소수 자릿수(정밀도)...\n", c.precision)
print("지수부 비트 수...\n", c.iexp)
print("float64의 최솟값...\n", c.min)
print("float64의 최댓값...\n", c.max)
전체 예제 코드
import numpy as np
# 특정 float 타입이 정밀하게 표현할 수 있는 대략적인 소수 자릿수를 얻으려면
# numpy.finfo() 메서드의 precision 속성을 사용합니다.
# finfo()의 첫 번째 매개변수는 정보를 얻고자 하는 float 데이터 타입입니다.
# float16 타입 확인
a = np.finfo(np.float16(45.976))
print("대략적인 소수 자릿수(정밀도)...\n", a.precision)
print("지수부 비트 수...\n", a.iexp)
print("float16의 최솟값...\n", a.min)
print("float16의 최댓값...\n", a.max)
# float32 타입 확인
b = np.finfo(np.float32(22.3))
print("\n대략적인 소수 자릿수(정밀도)...\n", b.precision)
print("지수부 비트 수...\n", b.iexp)
print("float32의 최솟값...\n", b.min)
print("float32의 최댓값...\n", b.max)
# float64 타입 확인
c = np.finfo(np.float64(29.2))
print("\n대략적인 소수 자릿수(정밀도)...\n", c.precision)
print("지수부 비트 수...\n", c.iexp)
print("float64의 최솟값...\n", c.min)
print("float64의 최댓값...\n", c.max)
실행 결과
대략적인 소수 자릿수(정밀도)... 3 지수부 비트 수... 5 float16의 최솟값... -65500.0 float16의 최댓값... 65500.0 대략적인 소수 자릿수(정밀도)... 6 지수부 비트 수... 8 float32의 최솟값... -3.4028235e+38 float32의 최댓값... 3.4028235e+38 대략적인 소수 자릿수(정밀도)... 15 지수부 비트 수... 11 float64의 최솟값... -1.7976931348623157e+308 float64의 최댓값... 1.7976931348623157e+308
결과 해석
각 부동소수점 타입은 다음과 같은 특성을 가집니다.
- float16 (반정밀도) – 약 3자리의 유효 소수 자릿수, 지수부 5비트
- float32 (단정밀도) – 약 6자리의 유효 소수 자릿수, 지수부 8비트
- float64 (배정밀도) – 약 15자리의 유효 소수 자릿수, 지수부 11비트
즉, 타입이 커질수록 더 많은 소수 자릿수를 정밀하게 표현할 수 있으며, 동시에 표현 가능한 값의 범위(min~max)도 넓어집니다. 과학적 계산이나 머신러닝처럼 높은 정밀도가 요구되는 작업에는 float64를, 메모리 절약이 중요한 경우에는 float16이나 float32를 선택하는 것이 좋습니다.