이 글은 컴퓨터에서 소수를 나타내는 방식인
부동 소수점에 대해서 정리한 글입니다.
실수란?
실수는 수직선 상에서 나타낼 수 있는 모든 숫자를 말합니다. 실수로는 정수, 유리수, 무리수 등 모든 수를 포함하는 개념입니다.
실수는 언제 사용될까?
실수는 연속적인 데이터나 정확한 표현이 필요할 때 사용합니다. 정수만으로는 표현할 수 없는 값, 정밀도가 필요한 계산에 적합합니다.
예시로는 수학, 과학, 공학, 컴퓨터 그래픽, 금융과 같은 분야에 사용됩니다.
컴퓨터에서 실수는 어떻게 표현할까?
현 시점에서 실수는 이진수 기반의 부동 소수점 방식으로 표현됩니다. 이는 IEEE 754 표준에 따라, 실수를 유효숫자와 지수로 나누어 표현합니다.
부동 소수점 방식은 무엇일까?
부동 소수점은 컴퓨터가 실수를 효율적으로 저장하고 계산할 수 있도록 설계한 방식입니다.
이는 부호, 지수 그리고 기수 3부분으로 나뉘게 됩니다.
왜 부동 소수점 방식을 사용할까?
부동소수점 방식은 고정된 메모리 크기 안에서 아주 큰 숫자와 아주 작은 숫자를 모두 표현할 수 있습니다. 또한, 숫자가 커질 수록 고정 소수점 방식에 비해 메모리를 더 적게 사용합니다. 고정소수점 방식에서는 큰 숫자를 그대로 저장하므로, 숫자 크기에 따라 비트 수가 계속 증가합니다. 이에 비해 부동 소수점 방식은 수의 크기와 상관 없이 숫자의 크기와 상관없이 항상 고정된 비트 수(현재는 32bit)을 사용합니다.
각 부분은 어떤 역할을 하는걸까요?
부호 부분은 양수와 음수를 나타내는 1bit 공간입니다. 0인 경우엔 양수, 1인 경우엔 음수를 나타냅니다.
(각 칸은 1bit로 구성되어 있습니다.)
지수 부분은 실수의 소수점 위치를 나타내고, Bias를 더하여 저장하며, 이는 음수 지수를 표현할 수 있게 합니다.
기본적으로 Bias는 2^n - 1을 의미합니다. n은 지수를 표현하는데 사용되는 비트 수 이므로, 현재 지수가 8bit이므로 Bias는 127을 나타냅니다.
가수 부분은 정규화된 이진수 표현에서 소수점 뒤의 부분을 나타냅니다. 가수는 숫자의 정밀도를 결정합니다.
Bias란 무엇일까요?
Bias는 지수를 표현할 때 사용하는 고정된 값입니다. Bias를 더함으로 음수 지수를 양수 지수로 변경할 수 있습니다.
컴퓨터는 비트로 데이터를 표현하기 때문에 음수를 저장하려면 부호 비트를 따로 두거나 특별한 처리를 해야 합니다. Bias 더하여 저장하게 되면 음수와 양수를 동일한 방식으로 처리할 수 있게 됩니다.
아직 잘 와닿지 않아서 양수와 음수를 직접 변환하는 과정을 통해 설명드리겠습니다.
10진수 6.75라는 수를 부동 소수점(32bit)으로 변환해보도록 하겠습니다.
순서는 다음과 같습니다. (1) 이진수 변환하기 (2) 정규화하기 (3)Bias 추가하기
(1) 이진수 변환하기
먼저 정수부분 6을 이진수로 변환하면 110이 되고, 소수부분 0.75를 이진수로 변환하면 0.11이 됩니다.
최종적으로 110.11가 됩니다.
(2) 정규화 하기
정규화란 무엇일까요?
정규화는 부동소수점 숫자를 표준화된 형태(1.XXX x 2^n)로 변환하는 것입니다.
왜 표준화된 형태를 만들어야 하나요?
우선 동일한 형식으로 표현시 계산과 저장이 단순해집니다. 즉, 일관성이 유지됩니다. 이 방식에선 숫자의 가장 큰 자릿수가 항상 1이기 때문에 따로 저장하지 않아도 됩니다. 이렇게 되면 23비트에 더 많은 정보를 담을 수 있습니다.
정규화는 다음과 같은 방식으로 진행됩니다.
1. 소수점을 숫자의 첫 번째 1 바로 뒤로 옮깁니다.
2. 110.11 → 1.1011
3. 소수점을 두 자리 왼쪽으로 이동했으므로, 2²를 추가해 줍니다.
최종적으로 1.1011 x 2² 라는 결과를 얻게 됩니다.
(3) Bias 추가하기
부동 소수점의 지수 부분엔 Bias와 지수를 더한 값을 저장하게 됩니다. 지수는 정규화시 소수점을 움직인 횟수를 의미합니다.
정규화시 소수점을 두 자리 왼쪽으로 이동했으므로 기존 Bias 값인 127에 2를 더해줍니다. 129라는 값을 얻게 됩니다.
129를 2진수로 표현하면 10000001이 됩니다. 즉, 지수부분이 10000001이 됩니다.
이제 가수 부분을 구해보도록 하겠습니다. 앞에서 말씀드린 것 같이 가수 부분은 규화된 이진수 표현에서 소수점 뒤의 부분을 나타냅니다.
1.1011에서 1011를 의미합니다. 총 23bit이므로, 10110000000000000000000가 됩니다.
부호 부분, 지수 부분 그리고 가수 부분을 합쳐서 나타내면 다음과 같습니다.
0 10000001 10110000000000000000000
음수 -6.75를 구하는 것은 사실 굉장히 간단합니다. 부호 비트를 0에서 1로만 변경 해주면 됩니다.
변환 결과는 다음과 같습니다.
1 10000001 10110000000000000000000
부동 소수점의 한계
정밀도 손실, 범위 제한, 계산 오차 등이 있으며, 이는 특정 상황(예: 금융 계산, 극단적인 숫자 계산)에서 부적합할 수 있습니다.
'Java' 카테고리의 다른 글
[Java] Serialization (2) | 2025.01.27 |
---|---|
immutable 객체로 만드는 방법 (2) | 2025.01.09 |
JVM 정복하기 (0) | 2025.01.09 |
[Effective Java] 생성자 대신 팩터리 메서드를 고려하라 (0) | 2024.12.11 |
자바 메모리 구조 (0) | 2024.10.02 |