1부 에서 이어지는 포스트입니다.
실수계산 오차와 부동소수점 ( feat. IEEE 754 표준 ) 1부
영어 공부겸 Medium의 개발 블로그를 탐방하던 도중에 이런 포스트를 찾았습니다.그리고 최근 개발 커뮤니티의 cs 질문 게시판에서 비슷한 주제의 질문이 보였습니다." 이 코드는 왜 false가 나올까
forrest-code-13.tistory.com
1부에서 컴퓨터가 실수의 소수부를 이진수로 변환해서 저장한다고 했습니다. 이번 포스트에서는 변환된 이진수를 컴퓨터가 물리적으로 어떻게 저장하지에 대해 알아보도록 하겠습니다.
부동소수점
실제로 컴퓨터에서 소수부가 있는 이진수를 저장할 때는 부동소수점(Floating Point)이라는 방법을 사용해 한번 더 변환을 거쳐서 저장합니다.
부동소수점은 Floating Point, 즉 "떠서 움직이는 점"이라는 뜻입니다. 다음은 소수점(Point)을 움직여서(Floating) 9.625라는 실수를 여러 형태로 표현한 것입니다.
0.09625 x 10² | 0.9625 x 10 | 9.625 | 96.25 x 10 ⁻¹ | 962.5 x 10 ⁻² |
( 0.09625 , 2 ) | ( 0.9625 , 1 ) | ( 9.625 , 0 ) | ( 96.25 , -1 ) | ( 962.5 , -2 ) |
컴퓨터에서 사용하는 부동소수점
컴퓨터는 부동소수점을 사용해 소수부를 가진 모든 이진수를 1.xxx~의 형식으로 변환해서 저장합니다. 다음은 실제로 컴퓨터가 9.625라는 실수를 저장하기 위해 수행하는 과정입니다.
10진수 | 9.625 |
10진수 ➡️ 2진수 | 1001.101 |
2진수 ➡️ 부동소수점 표현 | ( 1.001101 , 3 ) ( 소수점이 왼쪽으로 3칸 떠서 이동 ) |
IEEE 754 표준
이제 ( 1.001101 , 3 )을 물리적으로 저장할 차례입니다.
사실 저장이야 어떻게 하든 개발자 마음입니다. 1.001101과 3을 한번에 저장해도, 따로 저장했다가 꺼낼 때 합쳐도 됩니다. 하지만 그렇게 혼자만 아는 방식으로 저장한다면, 그 방식을 모르는 다른 시스템과 소통하거나 이식할 때 문제가 발생하게 됩니다.
따라서 모두가 같이 사용할 표준이란게 필요했고, 그래서 만든게 IEEE 754 표준입니다. IEEE 754 표준은 컴퓨터의 부동소수점 표현 방법에 대한 약속입니다.
자세히는 "사용할 수 있는 저장공간에 부동소수점 표현을 저장할 때, 표현의 각 영역( 부호, 가수, 지수 )에 몇 비트를 어떻게 사용할 것인지에 대한 약속"입니다.
부동소수점 표현 | 부호 | 가수 | 지수 |
( 1.001101 , 3 ) | + | 1.001101 | 3 |
IEEE 754 표준에 정의된 32bit 저장공간에 실수를 저장하는 방법
몇 비트를
IEEE 754 표준에 따르면 32bit의 저장공간에 실수를 저장할 경우 각 영역별로 다음과 같이 할당합니다. ( 저장공간의 크기가 달라지면, 그에 따라 할당되는 bit의 개수도 바뀝니다. )
총 저장공간 | 부호 | 가수 | 지수 |
32 bit | 1 bit | 23 bit | 8 bit |
어떻게
다음은 32bit의 저장공간에 부동소수 표현 ( 1.001101 , 3 )을 저장될 때, 그 공간의 bit들의 모습입니다.
부호 : 1bit | 0이면 양수, 1이면 음수 |
가수 : 23 bit | 모든 부동소수점 표현이 1.xxx~의 형태 시작합니다. 따라서 (하늘색) 1. 에 대한 정보를 저장할 필요가 없습니다. 결과적으로 가수 영역에는 소수점 아래 (초록색) 001101에 대한 정보만 저장됩니다. |
지수 : 8 bit | 지수 영역에는 (지수 + 127)의 값이 들어갑니다. 그리고 해석할 때는 역으로 지수 영역의 값에 127을 뺀 값을 지수로 해석합니다. 그 이유는 부동소수점을 설명할 때 보셨던 표현처럼, 소수점이 좌우로 움직일 수 있기 때문입니다. 이는 양수,음수 모두를 8bit내에서 효율적으로 표현하기 위한 방법입니다. ![]() |
Next
지금까지의 과정이 아래 코드 단 한줄을 작성했을 때 컴퓨터에서 벌어지는 과정들이었습니다.
float sample = 9.625;
이번에도 분량조절 실패로 나머지 궁금한 내용은 3부에서 다루도록 하겠습니다.
다음 포스트 내용
- BigDecimal 클래스는 어떻게 정확하게 실수를 저장하지?
- System.out.println(0.1)의 출력은 어떻게 그대로 0.1이 나오지?
참고자료
'CS' 카테고리의 다른 글
Java final 키워드 (1) | 2025.06.12 |
---|---|
실수계산 오차와 부동소수점 ( feat. IEEE 754 표준 ) 3부 (0) | 2025.05.21 |
URI vs URL vs URN (0) | 2025.04.14 |
REST API에서 "REST"의 의미 (0) | 2025.04.12 |
실수계산 오차와 부동소수점 ( feat. IEEE 754 표준 ) 1부 (1) | 2024.11.25 |