부동소수점

김뉴오·2025년 5월 3일

키워드

목록 보기
5/16
post-thumbnail

부동소수점(Floating Point)이란?

부동소수점은 소수점을 고정된 위치에 두지 않고, 가변적인 방식으로 표현하는 수의 형태이다.

즉, 아주 크거나 아주 작은 숫자를 효율적으로 표현할 수 있다.


부동소수점의 필요성

정수형 데이터(int, long)는 소수점이 없는 값을 표현하지만, 실수(float, double)는 소수점을 포함하는 값을 다루어야 한다.

하지만, 고정소수점(Fixed Point) 방식은 범위가 제한되므로, 더 넓은 범위의 실수를 표현하기 위해 부동소수점 방식을 사용한다.


부동소수점 표기법 (IEEE 754 표준)

부동소수점 수는 부호(Sign), 지수(Exponent), 가수(Mantissa) 세 부분으로 나뉜다.

  • 32비트 단정도(float)

    부호 (1비트)지수 (8비트)가수 (23비트)
    SEM
    • 부호(S): 0이면 양수, 1이면 음수
    • 지수(E): 8비트로 저장되며 Bias (127)를 적용하여 표현
    • 가수(M): 1.xxx... 형태로 저장
  • 64비트 배정도(double)

    부호 (1비트)지수 (11비트)가수 (52비트)
    SEM
    • 더 높은 정밀도와 범위를 제공함.

부동소수점의 예제

예시: 0.15625를 부동소수점으로 변환

  1. 이진수로 변환

    0.15625 (10진수)0.00101 (2진수)

  2. 정규화

    1.010 × 2^(-3)

  3. IEEE 754 형식으로 변환

    • 부호(S): 0 (양수)
    • 지수(E): 3 + 127 = 12401111100
    • 가수(M): 0100000... (23비트로 맞춤)
    • 최종 결과: 0 01111100 01000000000000000000000 (32비트)

FPU와 부동소수점의 관계

  • FPU는 부동소수점 연산을 빠르게 수행하는 장치
  • CPU의 ALU는 주로 정수 연산을 처리하지만, 부동소수점 연산은 FPU가 전담
  • IEEE 754 표준을 기반으로 부동소수점 연산을 처리
  • 과거에는 FPU가 별도 칩셋(x87)으로 존재했지만, 현대 CPU에는 내장되어 있음

부동소수점이 중요한 이유

(1) 실수 표현의 필요성

  • 정수형 데이터(예: int, long)만으로는 소수점이 포함된 숫자(예: 3.14, 0.0001, 2.718)를 다룰 수 없다.
  • 수많은 과학, 공학, 금융 계산에서 소수점 이하 값이 필수적이므로 실수를 저장하고 계산하는 방법이 필요하다.

(2) 매우 큰 수와 매우 작은 수 표현 가능

  • 부동소수점은 지수(exponent)와 가수(mantissa)를 이용하여 숫자를 표현한다.
  • 이를 통해 아주 큰 수(예: 1.23 × 10^100)와 아주 작은 수(예: 3.14 × 10^-50)도 저장할 수 있다.
  • 예를 들어, float(32비트)는 ±10⁻³⁸ ~ 10³⁸까지 표현 가능하고, double(64비트)는 ±10⁻³⁰⁸ ~ 10³⁰⁸까지 표현 가능하다.

(3) 효율적인 저장 방식

  • 부동소수점은 고정소수점(Fixed Point) 방식보다 메모리를 절약하면서 넓은 범위의 수를 표현할 수 있다.
  • 예를 들어, 32비트 부동소수점(float)은 ±10⁻³⁸ ~ 10³⁸ 범위의 숫자를 단 4바이트에 저장한다.

(4) 표준화된 연산 방식

  • IEEE 754 표준 덕분에, 모든 컴퓨터 및 프로그래밍 언어에서 부동소수점 연산 방식이 동일하다.
  • 같은 코드가 다른 컴퓨터에서도 동일한 결과를 출력할 수 있도록 보장한다.

부동소수점의 한계 (단점)

부동소수점은 매우 유용하지만, 몇 가지 단점도 있다.

(1) 정확도 문제 (오차 발생)

  • 부동소수점은 일부 실수를 정확히 표현할 수 없다. 예를 들어, 0.1(10진수)는 2진수에서 무한 반복 소수(0.0001100110011...)가 되어, 근사값으로 저장된다.
  • 이로 인해 덧셈, 뺄셈, 곱셈을 반복하면 작은 오차가 누적될 수 있다. 예제:
    
    print(0.1 + 0.2)  # 결과: 0.30000000000000004
    

(2) 연산 속도가 정수보다 느림

  • 부동소수점 연산은 정수 연산보다 훨씬 복잡하고, 느리다. 그래서 일부 고성능 시스템에서는 고정소수점(Fixed Point) 연산을 사용하기도 한다.

(3) 비교 연산이 부정확할 수 있음

  • 작은 오차 때문에 if x == y: 같은 비교 연산이 예상과 다르게 동작할 수 있다.
profile
Bello! NewOld velog~

0개의 댓글