컴퓨터는 모든 수를 이진수로 표현한다.
그것이 실수가 됐든, 정수가 됐든 항상 부동소수점 방식을 사용하는데 이것이 왜 문제가 될까?
그리고, 문제가 있으면서도 왜 현대 컴퓨터에서는 부동소수점 방식을 채택했을까?
컴퓨터에는 실수를 표현하는 방식이 크게 2가지가 있다.
첫 번째는 고정소수점, 두 번째는 부동소수점이다.
먼저 고정소수점이란?
- 정수를 표현하는 비트 수와 소수를 표현하는 비트 수를 미리 정해 놓고 해당 비트만큼만 사용해서 숫자를 표현하는 방식
- ex) 실수 표현에 4byte(32bit)를 사용하고 그 중 부호(아래에서 괄호로 표시) 1bit, 정수 16bit, 소수 15bit를 사용하도록 약속해 놓은 시스템에 있다고 가정하자.
이러한 시스템에서 301.3을 표현하면 먼저 301.3을 이진수로 변환해 보면 100101101.01001100110011001100110이다.
이때, 부호부는 0(양수이므로), 정수부는 0000000100101101(16비트), 가수부는 0.3의 이진표현은 무한 소수이므로 앞의 15비트만 가져와 010011001100110이 된다.
따라서, 301.3을 이 예시 시스템에서 표현하면 다음과 같다:
- 부호부: 0
- 정수 부분: 0000000100101101
- 소수 부분: 010011001100110
- 가수부의 일부를 버린다고 했을 때 짐작했듯이 정수를 표현하는 bit를 늘리면 큰 숫자를 표현할 수 있지만 정밀한 숫자를 표현하긴 힘들다. 그래서 소수를 표현하는 bit를 늘릴 경우 정밀한 숫자를 표현할 수 있지만 큰 숫자를 표현하지 못한다.
- 이러한 문제를 해결하기 위해 부동소수점을 쓴다.
부동소수점이란?
- 일반적으로 사용하고 있는 방식은 IEEE에서 표준으로 제안한 방식을 따르는데 부호부 1비트, 지수부 8비트, 가수부 23비트로 이루어져 있다. 만약, 똑같이 301.3을 부동소수점 방식으로 나타낸다고 해보자.
- 먼저 301.3을 이진수로 바꿔준다. (301.3 = 100101101.01001100110011001100110)
- 이후 100101101.01001100110011001100110을 정수의 자릿수가 하나만 되도록 소수점을 옮겨준다.
-> 1.00101101010011001100110011001100110 ×2^82^8 - 2^8의 8을 지수라고 하고 IEEE754에서는 지수부에 (127+지수)를 이진수로 기록해 둔다.
-> 지수부 = 10000111 - 나머지 가수부는 소수점 이후에 나오는 00101101010011001100110011001100110이 되는데, 만약 23자리 보다 크다면 잘라내고 작다면 0으로 채워 넣는다.
"그럼 부동소수점도 가수부에서 비트를 넘어가버리면 버린다고 했는데 정확한 수로 계산이 안 되는 거 아니야?"
라고 생각하시는 분이 계실 텐데 질문에 대한 답만 드리면 맞다. 정확한 수로 변환이 이루어지지는 않는다.
그러나, 부동소수점을 사용하는 이유는 고정소수점 방식에 비해 유연하고 이진수로 표현 가능한 범위가 고정소수점보다 광범위하기 때문이다. 정확한 값은 얻어내지 못해도 최대한 그 근삿값에 도달한다.
정리하자면,
공통점
- 고정소수점과 부동소수점 방식 모두 가수부의 비트로 수를 표현하는 과정에서 비트 수에 제한이 있기 때문에, 표현 가능한 수의 정밀도에 한계가 있다.
때문에 모든 실수를 정확히 표현할 수 없고, 표현 범위를 넘어서거나 비트로 정확히 표현할 수 없는 수에 대해서는 근삿값을 사용하게 된다.
차이점
- 고정소수점 방식은 소수점의 위치가 고정되어 있어서, 해당 방식으로 표현할 수 있는 수의 범위와 정밀도가 제한적이다. 특히, 매우 크거나 매우 작은 수를 표현하기 어렵다.
- 반면, 부동소수점 방식은 소수점의 위치를 유동적으로 조절할 수 있다(이 때문에 "부동"소수점이라고 한다).
가수부와 지수부를 분리하여 표현함으로써, 같은 비트 수를 사용하더라도 훨씬 더 넓은 범위의 수를 표현할 수 있으며, 유연성이 뛰어나다. 이는 소수점을 '이동'시킬 수 있기 때문에, 매우 큰 수와 매우 작은 수 모두를 정밀하게 표현할 수 있게 해 준다.
따라서, 이러한 이유로 현대 컴퓨터 시스템에서는 넓은 범위의 수치를 표현하고 계산해야 하는 과학, 엔지니어링, 금융 분석 등에서 부동소수점 방식을 사용한다.
'Things I was curious about' 카테고리의 다른 글
Nest.js, 의존성 주입(DI), OOP에 대해서 (0) | 2024.03.28 |
---|---|
[CS] 컴퓨터 시스템으로의 여행 (0) | 2024.03.27 |
[TCP/IP] 개념 및 계층 구조 이해 (0) | 2024.03.25 |
static, private, public은 언제 사용하는걸까? (2) | 2024.03.24 |
[AWS] VPC구성에서 서버구축까지 (2) | 2024.03.22 |
댓글