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

파이썬(Python)으로 부동소수점 실수를 이진수로 변환하기

이번 글에서는 실수(부동소수점) 값과 결과의 소수점 이하 자릿수를 입력받아, 해당 값을 이진수(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 매개변수 값을 늘려 주면 됩니다.