파이썬에서 float함수를 알기전에 실수를 다루는 것은 어떻게 보면 가장기본적이면서 중요한 부분입니다. 오늘 이글에서는 float함수의 기본부터 심화까지 알아보겠습니다.
실수를 표현하는 부동 소수점 방식에 대해서 이해는 좀더 정확하고 효율적인 코드를 작성하는데 아주 필수적입니다.
1. 파이썬 float()함수 기본
파이썬에서 실수 표현하는 방법은 두 가지가 있습니다. 고정 소수점과 부동 소수점이렇게 두 가지로 나뉘게 됩니다. 더 자세한 내용은 아래를 참고하세요.
# 기본적인 float 변수
number = 3.14
print(type(number)) # 출력: <class 'float'>
float함수 고정 소수점 방식
고정 소수점 방식은 소수점의 위치를 고정하여 숫자를 표현합니다. 정수부와 소수부를 나누어서 저장하고 일정한 소수점 이하 자릿수를 유지합니다. 이 방식은 단순하지만 표현할 수 있는 숫자의 범위가 제한적입니다. 주로 금융계산 등에서 사용되고 메모리 사용량이적다는 장점이있습니다.
# 고정 소수점 예제 (파이썬에서는 직접적으로 지원하지 않음)
# 예를 들어, 소수점 이하 2자리까지 고정한 값을 표현
fixed_point_value = 12345 # 실제로는 123.45를 의미
float함수 부동 소수점 방식
부동 소수점 방식은 유효숫자를 나타내는 가수(mantissa)와 소수점의 위치를 나타내는 지수를 숫자로 표현합니다. 이는 더 넓은 범위의 숫자를 표현할 수 있게 해주고, 파이썬을 포함한 대부분의 프로그래밍 언어의 대부분에서 사용합니다.
# 부동 소수점 예제
a = 1.23e-4 # 0.000123
b = 1.23e+4 # 12300.0
print(a) # 출력: 0.000123
print(b) # 출력: 12300.0
2. 부동 소수점 방식의 문제점
부동 소수점 방식은 실수를 효율적으로 표현할 수 있지만, 오차가 발생할 수 있습니다. 이는 2진법으로 10진수를 정확히 표현할 수 없습니다. 예를 들면, 0.1을 2진법으로 표현하면 무한 소수가되어서 근사값으로 저장됩니다.
오차의 예시
print(0.1 + 0.2) # 예상 출력: 0.3, 실제 출력: 0.30000000000000004
위 예시에서 볼 수 있듯 0.1과 0.2를 더한결과는 0.3이아닌 0.30000000000000004가되는데요. 이는 부동소수점 연산에서 발생하는 일반적인 오차입니다.
오차가 생기는 이유
부동 소수점 방식의 오차는 아직 소수로 정확히 표현할 수 없는 10진수 소수에서 주로 발생하죠. 이는 컴퓨터가 2진법을 사용하여서 소수를표현하기 때문인데요. 0.1과 같은 소수는 2진법으로 표현할 때 무한소수가 되므로, 근사치로 저장되며 이로 인해서오차가 발생한다.
# 0.1을 이진 소수로 표현
# 0.0001100110011001100110011001100110011001100110011...
3. 파이썬에서 부동소수점 오차 해결하는방법
파이썬에서 부동 소수점 오차를 줄이기위해서 여러 방법이 있습니다. 아래를 참고하세요.
decimal모듈 사용
decimal 모듈을 사용하면 십진 소수의 정확한 연산이 가능합니다. 금융 계산등에서 유용하게 사용되는데요. 아래의 코드를 참고하세요.
from decimal import Decimal
a = Decimal('0.1')
b = Decimal('0.2')
c = a + b
print(c) # 출력: 0.3
fractions모듈 사용
fractions모듈을 사용하면 분수로 실수를 정확하게 표현할 수 있습니다. 순환소수와 같은 값을 처리할 때 아주 유용한데요. 아래의 코드를 확인하세요.
from fractions import Fraction
frac = Fraction(1, 3)
print(frac) # 출력: 1/3
frac_sum = Fraction('0.1') + Fraction('0.2')
print(frac_sum) # 출력: 3/10
math 모듈의 fsum() 사용
math.fsum() 함수를 사용하면 부동 소수점 합계를 정확하게 계산할 수 있습니다. 다수의 실수를 더할 때 아주 유용합니다.
import math
numbers = [0.1, 0.2, 0.3]
sum_numbers = math.fsum(numbers)
print(sum_numbers) # 출력: 0.6
round() 함수 사용
round() 함수를 사용하면 부동 소수점 오차를 줄일 수 있습니다. 특정 자릿수까지 반올리하여 표시할 때 유용합니다.
result = round(0.1 + 0.2, 2)
print(result) # 출력: 0.3
float.as_integer_ratio() 사용
float.as_integer_ratio() 함수는 부동 소수점을 분수로 변환하여 정확한 값을 확인할 수 있게 합니다. 이는 두 부동 소수점 간의 정확한 비율을 확인할 때 유용한데요. 아래의 코드를 확인하세요.
ratio = (0.1).as_integer_ratio()
print(ratio) # 출력: (3602879701896397, 36028797018963968)
math.isclose() 사용
math.isclose() 함수는 두 부동 소수점 숫자가 근사값인지 화긴할 때 유용합니다. 이는 특히 실수를 비교할 때 사용됩니다.
import math
a = 0.1 + 0.2
b = 0.3
print(math.isclose(a, b)) # 출력: True
4. 실수형 변환
파이썬에서는다양한 방법으로 실수형 변환을 지원하는데요. 실수형 변환을 하는 방법의 대해서 아래 정리해두었습니다.
정수를 실수로 변환
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
nan과 inf를 실수형으로 변환
float()
함수는 ‘nan’ (Not a Number)와 ‘inf’ (Infinity)를 실수형으로 변환합니다. 이는 데이터 분석 및 과학 계산에서 유용합니다.
nan_val = float('nan')
inf_val = float('inf')
print(nan_val) # 출력: nan
print(inf_val) # 출력: inf
5. 결론
오늘은 이렇게 파이썬 함수float()의 대해서 알아보았는데요. 부동소수점 방식 등등의 대해서 알아보았고 파이썬의 decimal, fractions, math.fsum(), round() 등 다양한 모듈과 함수를 통해서 오차를 해결할 수 있다는것을 알아보았죠.