본문 바로가기

CS/컴퓨터 구조

[컴퓨터 구조] 데이터 부동 소수점

728x90

소수란?

소수(decimal)는 1보다 큰 정수 중에서 1과 자기 자신만을 약수로 가지는 자연수를 뜻합니다. 예를 들어, 2, 3, 5, 7과 같은 숫자가 소수입니다.

프로그래밍에서 소수 연산을 다룰 때 일반적인 개념과 달리 컴퓨터의 소수점 표현 방식의 한계로 인해 일부 오차가 발생할 수 있습니다.

 

소수 표현

일부 실수 계산에서 우리가 흔히 예상하는 결과와 컴퓨터가 계산하는 결과가 달라질 수 있습니다. 예를 들어 0.1 + 0.2의 계산 결과는 이론적으로 0.3이지만, 컴퓨터는 이 결과를 정확히 표현하지 못할 때가 있습니다:

System.out.println(0.1 + 0.2 == 0.3); // 결과는 false

이와 같은 현상은 컴퓨터가 소수를 표현하는 방식인 "부동 소수점" 표현 방식의 한계로 인해 발생합니다.

 

부동 소수점(floating-point)의 한계

컴퓨터는 실수를 정확히 표현하지 못하는 경우가 많습니다. 컴퓨터에서 실수는 부동 소수점으로 표현되며, 이는 m * 2^n 형태로 나타낼 수 있습니다. 이때 m은 가수(significand), n은 지수(exponent)입니다. 이러한 표현 방식 때문에 일부 실수는 근사값으로 저장되며, 계산 과정에서 미세한 오차가 발생할 수 있습니다.

 

 

필수 배경 지식

부동 소수점 표현을 이해하기 위해 필요한 개념은 기수(radix)지수(exponent)입니다.

예를 들어 십진수 123.456을 지수와 기수의 형태로 표현하면:

  • 123.456 = 1.23456 * 10^2

여기서 10은 기수이고, 2는 지수입니다.

 

 

이진수의 소수점 표현

컴퓨터에서는 이진수를 m * 2^n 형태로 표현합니다. 예를 들어, 1001011.1010101을 부동 소수점 형태로 나타내면:

  • 1001011.1010101 = 1.0010111010101 * 2^6

이때, 2는 기수, 6은 지수, 1.001011은 가수로 표현됩니다.

 

 

IEEE 754 표준

컴퓨터에서 실수를 표현하기 위한 대표적인 방식은 IEEE 754 표준입니다. 이 표준은 가수와 지수를 특정 방식으로 분리하여 저장합니다.

 

가수와 지수의 저장 방식

  • 가수 부분은 1을 제외하고 저장됩니다.
  • 지수는 바이어스(bias)를 더해 저장합니다. 바이어스 값은 일반적으로 2^(k-1) - 1로 계산됩니다 (k는 지수 비트의 개수).

예제

IEEE 754 표준에서는 0.1과 같은 소수를 정확히 표현하지 못합니다. 0.1은 이진수로 표현할 때 무한히 많은 가수가 필요하기 때문에 근사값으로 저장되며, 이런 차이 때문에 0.1 + 0.2의 결과가 정확히 0.3이 아닌 값이 나올 수 있습니다.

 

문제점

십진수를 이진수로 변환할 때 일부 소수는 정확하게 표현되지 않아 무한히 반복되는 비트를 필요로 합니다. 이로 인해 컴퓨터는 근사값으로 소수를 표현하며, 이는 실수 계산에서 오차를 발생시킵니다. 대표적인 예로:

  1. 1/3은 십진수로 표현하면 무한히 반복되는 소수 0.3333...입니다.
  2. 1/10을 이진수로 표현할 때도 무한히 반복되는 패턴이 생깁니다.

따라서 0.1이나 0.2와 같은 값을 이진수로 변환하여 저장하면 약간의 오차가 발생하게 됩니다.

728x90