Computer >> 컴퓨터 >  >> 프로그래밍 >> Python

Python NumPy finfo()로 float 타입의 유효 소수 자릿수(정밀도) 구하기


특정 종류의 부동소수점(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를 선택하는 것이 좋습니다.