이번 글에서는 실수(부동소수점) 값과 결과의 소수점 이하 자릿수를 입력받아, 해당 값을 이진수(binary) 형태로 변환하는 파이썬 프로그램을 만들어 보겠습니다.
변환은 크게 세 단계로 진행됩니다. 먼저 실수에서 정수부를 분리해 이진수로 바꾸고, 다음으로 소수부를 이진수로 바꾼 뒤, 마지막에 두 결과를 결합하여 완전한 이진수를 얻습니다.
변환 원리
정수부는 파이썬 내장 함수인 bin()을 사용해 간단히 2진수 문자열로 변환할 수 있습니다. 소수부는 별도의 절차가 필요합니다. 소수에 2를 계속 곱하면서 결과가 1 이상이면 '1'을 기록하고 1을 빼고, 1 미만이면 '0'을 기록하는 과정을 원하는 자릿수만큼 반복하는 방식입니다.
예시
실수 값: 22.625 정수부 22를 이진수로 변환 → 10110 소수부 0.625를 이진수로 변환 → 0.101 정수부와 소수부를 결합 → 10110.101
즉, 10진수 22.625는 2진수로 10110.101입니다.
예제 코드
def float_to_binary(number, places=3):
# 정수부와 소수부를 분리
whole_str, dec_str = str(number).split(".")
whole = int(whole_str)
# 정수부를 이진수로 변환
result = bin(whole)[2:] + "."
# 소수부를 이진수로 변환 (2를 반복해서 곱함)
frac = float("0." + dec_str)
for _ in range(places):
frac *= 2
if frac >= 1:
result += "1"
frac -= 1
else:
result += "0"
return result
# 실행 코드
n = input("실수 값을 입력하세요 : \n")
p = int(input("결과의 소수점 이하 자릿수를 입력하세요 : \n"))
print(float_to_binary(n, places=p))
실행 결과
실수 값을 입력하세요 : 2.34 결과의 소수점 이하 자릿수를 입력하세요 : 3 10.010
입력값 2.34는 이진수로 약 10.010에 해당합니다(2 + 0.25 = 2.25). 소수점 이하 자릿수를 늘리면 실제 값인 2.34에 더 가까운 근삿값을 얻을 수 있습니다.
참고: 부동소수점 오차
모든 10진 소수가 2진수로 유한하게 표현되는 것은 아닙니다. 예를 들어 0.1은 2진수로 무한히 반복되기 때문에 지정한 자릿수에서 잘린 근삿값이 출력됩니다. 따라서 더 높은 정밀도가 필요하다면 places 매개변수 값을 늘려 주면 됩니다.