본문 바로가기
데이터분석과 AI/데이터분석과 AI 일반

부동소수점 이란? 부동소수점 계산 방식에 따른 오차 발생 예제

by 우공80 2023. 8. 8.
728x90

 

빅데이터분석기사 준비 중에 논리적으로는 맞지만, 실제로는 답이 틀리는 경우를 경험한 적이 있습니다.

부동소수점 계산방식으로 인한 오류였는데요. 

 

IEEE 754 부동소수점 표기법이란?

IEEE 754 부동소수점 표기법은 실수에 대한 산술 연산을 이진 형식으로 표현하고 수행하기 위해 널리 사용되는 표준입니다. 부동 소수점 숫자가 구조화되고 메모리에 저장되고 조작되는 방식을 정의합니다. 이 표기 방식은 컴퓨터가 일관되고 표준화된 접근 방식으로 매우 큰 값과 매우 작은 값을 포함하여 광범위한 숫자를 처리할 수 있도록 하기 때문에 컴퓨팅에서 특히 중요합니다.

 

IEEE 754에서 부동 소수점 숫자는 다음과 같이 표현됩니다.

 

  1. 부호 비트(s): 이 비트는 숫자의 부호를 나타냅니다. 0은 양수를 나타내고 1은 음수를 나타냅니다.
  2. 지수(e): 지수는 숫자의 스케일 또는 크기를 나타냅니다. 양수 지수와 음수 지수를 모두 나타낼 수 있도록 실제 지수에 바이어스 값이 추가되는 편향된 표현을 사용하여 저장됩니다. 바이어스 값은 지수가 저장될 때 항상 음수가 아님을 보장합니다.
  3. 분수(가수라고도 함)(m): 분수는 숫자의 유효 숫자를 나타냅니다. 이진 분수이며 일반적으로 소수 부분이 선행 1비트로 정규화됩니다.

부동 소수점 숫자 x는 (-1)^s * m * 2^e로 표현됩니다.

부동소수점을 사용하는 이유

부동 소수점 표기법은 여러 가지 이유로 컴퓨팅에 사용됩니다.

  1. 실수의 표현: 컴퓨터는 모든 실수를 정확하게 표현할 수 없는 이진 표현을 사용합니다. 부동 소수점 표기법을 사용하면 정밀도와 범위를 절충할 수 있습니다. 합리적인 수준의 정확도를 유지하면서 매우 큰 숫자와 매우 작은 숫자를 모두 나타낼 수 있습니다.
  2. 과학 및 공학 계산: 많은 과학 및 공학 계산에는 다양한 크기의 숫자를 포함하여 광범위한 값이 포함됩니다. 부동 소수점 표기법을 사용하면 일관된 접근 방식으로 이러한 계산을 수행할 수 있습니다.
  3. 효율성: 부동 소수점 산술은 사용자가 제한 사항을 이해하고 관리하는 한 이진 형식으로 직접 십진법 산술을 수행하는 것보다 훨씬 빠를 수 있습니다.
  4. 호환성 및 표준화: IEEE 754는 산업 표준 형식으로 부동 소수점 연산이 다양한 하드웨어 및 소프트웨어 플랫폼에서 일관되도록 합니다. 이를 통해 시스템 간에 계산을 안정적으로 교환할 수 있습니다.
  5. 물리적 양의 표현: 물리학, 공학 및 시뮬레이션과 같은 분야에서 부동 소수점 표기법은 종종 다양한 정밀도로 측정 또는 계산되는 양에 대한 적절한 표현을 제공합니다.

부동소수점 사용 시 발생할 수 있는 오류 

아래는 학생들의 키와 몸무게로 BMI(체질량지수)를 구하는 문제입니다. 

키가 cm단위로 주어졌기 때문에 m단위로 변환하기 위해 100으로 나누는 부분이 있는데요. 

 

아래에서 bmi_1과 bmi_2를 구하는 계산식은 논리적으로는 동일한 식입니다.

 

bmi_1 = 체중 / (키(cm) * 키(cm) / 100 / 100)

bmi_2 = 체중 / (키(cm) / 100 * 키(cm) / 100)

import numpy as np
import pandas as pd

# Set seed for reproducibility
np.random.seed(43)

# Generate random heights (in cm) and weights (in pounds)
num_samples = 20
min_height_cm = 150  # Minimum height in cm
max_height_cm = 190  # Maximum height in cm
min_weight_kg = 40  # Minimum weight in pounds
max_weight_kg = 120  # Maximum weight in pounds

random_heights_cm = np.random.randint(min_height_cm, max_height_cm + 1, num_samples)
random_weights_lb = np.random.randint(min_weight_lb, max_weight_lb + 1, num_samples)

# Create a DataFrame to store the generated data
data = {
    'Height (cm)': random_heights_cm,
    'Weight (kg)': random_weights_lb
}
df = pd.DataFrame(data)

# Calculate BMI values using the provided formulas
df['bmi_1'] = df['Weight (kg)'] / (df['Height (cm)']*df['Height (cm)'] / 100/100)
df['bmi_2'] = df['Weight (kg)'] / ((df['Height (cm)'] / 100) * (df['Height (cm)'] / 100))

# Compare bmi_1 and bmi_2 and add a new column with Y if equal, N if different
df['BMI Comparison'] = np.where(df['bmi_1'] == df['bmi_2'], 'Y', 'N')

decimal_places = 20  # Change this to your desired number of decimal places
pd.set_option('display.precision', decimal_places)

# Display the DataFrame
df[df['BMI Comparison']=='N']

Output: 논리적으로 동일한 식이지만, 실제 계산된 결과를 보면, 소수점 12자리 즈음부터 오차가 발생하는 것을 볼 수 있습니다.

이렇게 부동소수점 방식에서의 오차 발생가능성을 인식하는 것이 중요합니다. 이러한 이해를 가지고 있어야 예상치 못한 오류를 피하고 정확하고 신뢰할 수 있는 수치 계산을 보장할 수 있습니다.

 

"이 포스팅은 쿠팡 파트너스 활동의 일환으로, 이에 따른 일정액의 수수료를 제공받습니다."

728x90

댓글