파이썬에서 float은 실수를 표현하는 데 사용되는 기본 데이터 타입입니다. 하지만 실수를 표현하는 방식에는 여러가지가 있습니다. 그중에서 float은 부동 소수점 방식을 가지고 있습니다.
오늘 이글에서는 파이썬 float타입의 기본 개념부터 심화내용까지 체계적으로 알려드리고 실수표현과 float을 사용하는데 있어서 문제들을 어떻게 해결해야하는지에 대해서 알아보도록 하겠습니다.
파이썬 float 기본개념
실수와 부동 소수점 방식
컴퓨터는 모든 데이터를 0과 그리고 1로 이루어진 2진수로 처리하는데요. 정수는 2진수로 표현하기가 상대적으로 간단한데 실수는 2진수로 표현하기가 굉장히 복잡합니다. 파이썬의 float타입은 IEEE 754 표준을 기반으로 하는 부동 소수점 방식으로 실수를 표현합니다.
부동 소수점 방식에서는 실수를 가수부와 지수부로 나누어서 표현하는데요. 이게 무슨 말이냐면 예를들어서 12.375는 1.2375 x 2^3 으로 표현될 수 있습니다. 여기서 가수부라는것은 1.2375를 말합니다. 반대로 지수부는 3을 말합니다. 이런 방식은 매우 넓은범위의 실수를 표현할 수 있지만, 모든 실수를 정확히 표현할 수는 없습니다.
float 타입의 특징
파이썬의 float타입은 64비트의 부동 소수점 숫자를 사용합니다. 이 구조는 약 15-17자리의 10진수 숫자를 정확히 표현할 수 있게 해줍니다. 그런데 2진수로 실수를표현하다 보니 일부 소수는 무한 소수로 표현되고, 이로인해서 소수점 이하의 숫자에서 오차가 발생할 수 있습니다.
x = 0.1 + 0.2
print(x) # 결과: 0.30000000000000004
부동 소수점 오차의 문제점
부동 소수점 방식은 숫자의 범위를 넓게 표현할 수 있지만, 정확한 숫자를 표현하는 데는 한계가 있습니다. 특히 10진수를 2진수로 변환할 때 오차가 발생할 수 있습니다.
오차의원인
부동 소수점 방식에서 일부 10진수는 2진수로 변환할 수 없는 경우가 많습니다. 예를들어서 0-1이라는 숫자는 2진수로 저확히 표현할 수 없어서 근사값으로 저장하게됩니다. 이로인해서 산술 연산에서 오차가 발생하게됩니다. 신기하죠?
print(0.1 + 0.2 == 0.3) # 결과: False
오차 어떻게 처리해야할까?
부동소수점 오차를 다루는 방법은 몇가지가 있습니다. 여기서는 주요방법들을 살펴 보겠습니다.
decimal 모듈 사용
deciaml 모듈은 고정 소수점 방식과 유사하게 10진수를 사용하여서 숫자를 처리하게됩니다. 이를 통해서 부동 소수점 오차를 줄일 수 있습니다.
from decimal import Decimal
result = Decimal('0.1') + Decimal('0.2')
print(result) # 결과: 0.3
decimal 객체는 정확한 소수점 자릿수를 표현할 수 있고, 금융 계산등에서 아주 유용하게 사용됩니다.
fractions 모듈 사용
순환 소수와 같은 경우 fractions 모듈을 사용하여서 분수 형태로 정확하게 표현할 수 있습니다. 이를 통해서 실수르 정확하게 표현할 수 있습니다.
from fractions import Fraction
fraction_result = Fraction('10/3')
print(fraction_result) # 결과: 10/3
오차 범위 설정하기
실수 비교시 math.fabs()와 sys.float_info.epsilon을 활용해서 오차 범위를 설정할 수 있습니다. 이 방법은 실수의 정확한 비교에 유용합니다.
import math, sys
x = 0.1 + 0.2
is_close = math.fabs(x - 0.3) <= sys.float_info.epsilon
print(is_close) # 결과: True
float 타입의 변환
파이썬에서는 float() 함수를 사용해서 다양한 데이터형식을실수형으로 변환할 수 있습니다. 이과정에서 변환할 데이터의 유형과 형식에 따라서 적절한 처리가 필요합니다.
정수를 실수로 변환하기
정수를실수로 변환하려면 float()함수를 사용할 수 있습니다. 이과정은 간단하고 정수값을 실수값으로 변경해줍니다.
a = 2
float_a = float(a)
print(float_a) # 결과: 2.0
문자열을 실수로 변환하기
실수 형태의 문자열을 실수로 변환할 때는 float()함수르 사용할 수 있습니다. 문자열이 유효한 실수형태일때만 변환할 때 오류가 발생하지 않습니다. 아래를 참고하세요.
b = '2.5'
float_b = float(b)
print(float_b) # 결과: 2.5
문자열이 실수가 아닌경우 'ValueError' 가발생할 수 있습니다. 예를들어 float('abc') 는 오류를 발생합니다.
nan과 inf 처리하기
nan(Not a Number)과 inf(Infinity)같은 특별한 값을 문자열로부터 실수형으로변환할 수 있습니다.
c = 'nan'
float_c = float(c)
print(float_c) # 결과: nan
d = 'inf'
float_d = float(d)
print(float_d) # 결과: inf
실수를 사용하는 실용적인 팁
실수를 사용할때는 정확하게 연산과 비교를 보장하기 위해서는 다음과같은 방법들을 참고하는 것이 좋습니다.
정확한 요구 사항 파악하기
연산의 정확도와 오차를 감안해서 필요한 정확도를 결정짓는데요. 특히 금융쪽이나 정확하게 분석하는데에는 decimal 모듈을 사용하는것이 유용합니다.
연산 결과 검증하기
중요한 연산 결과는 검증하고, 비교할 때 오차를 허용할 수 있는 범위를 설정합니다. math.isclose() 함수는 이과정에서 유용합니다. 아래의 코드를 참고하세요.
import math
a = 0.1 + 0.2
b = 0.3
is_close = math.isclose(a, b, rel_tol=1e-9)
print(is_close) # 결과: True
데이터 변환시 주의사항
문자열에서 실수로변환할 때는 입력데이터가 유효한 실수형 문자열인지 확인하고, 변환 오류를 방지하기 위해서 예외처리를 포함하는것이 좋습니다.
마무리
부동 소수점 연산은 강력한 도구이지만, 오차를 동반할 수 있는 한계가 있습니다. 이런 한계를 이해하고, Decimal과 Fractions와 같은 모듈을 사용해서 정확한 수치 연산을 수행하는것이 중요합니다. 또 실수 연산시의 오차를 고려한 알고리즘 설계와 데이터검증 절차를 통해 더욱 신뢰성 높은 결과를 얻을 수 있습니다.
'IT' 카테고리의 다른 글
로지텍 마우스 dpi 확인 드라이버 설치하기 | 로지텍 g102드라이버설치 (0) | 2024.07.27 |
---|---|
파이썬(python) 라이브러리란 무엇인가? | 뜻과 종류들 math, time, statistics (2) | 2024.07.23 |
파이썬(python) int() 함수 기초부터 심화까지 알아보자 (0) | 2024.07.19 |
자바스크립트 비동기처리란 무엇인가? (1) | 2024.06.09 |
객체지향프로그래밍 언어란 무엇인가? (0) | 2024.06.04 |