부동 소수점에 관하여..
컴퓨터에서 소수는 어떻게 저장되고 계산 될까
흔히들 컴퓨터는 2진수 형태인 0,1 로만 이루어진 값들을 연산하고 저장하는 시스템으로 알고 있다.
산수 연산을 하더라도 10진수 체계의 숫자들이 있다면, 이걸 2진수로 바꾸고, 메모리에 저장하다가 연산을 위해 컴퓨터 레지스터에 옮긴다음,
산술연산장치 즉, ALU 라는 것에 의해 계산이 되는데, 이 또한 안에는 and, or, xor 같은 논리게이트들을 통해 덧셈 뺄셈, 곱하기, 나눗셈 등을 구현할 수 있게된다.
일단, 계산되는 대상들이 2진수 비트 값들이고, 보통 이게 16진수 형태로 변환되어 저장될텐데, 그럼 소수는 소수점(.) 때문에 이걸 어떻게 저장하길래 이렇게 연산이 가능한거지 라는 의문이 저절로 생기게된다.
이번 시간은 이에 대해 알아볼려고 한다.
부동 소수점 얘기를 하기에 앞서 먼저 고정 소수점에 대해 먼저 얘기해보겠다. 그럼 부동소수점이 왜 나왔는지에 대해 이해할 수 있을 것이다.
고정 소수점이라 함은 말그대로 실수를 정수 부분과 소수 부분 나누어 각각 고정된 위치에 저장한다는 뜻이다. 그럼 어떤 고정된 위치에 저장되는건가? 바로 위에 위 사진을 보면 저렇게 32bit 일련의 비트체계가 있으면, 16비트를 정수 부분에 할당하고, 15비트를 소수 부분에 할당한다. 1bit는 부호 비트로 놔둔다.
그럼 만약 263.3을 고정 소수점으로 표현하게된다면, 어떻게 표현될까
일단 263.3을 정수와 소수로 분리한다음, 각각 2진수 형태로 바꿔보자
정수 부분은 0000000100000111 이고, 소수 부분은 010011001100110 이다. 물론 정확한 표현은 불가능하므로 근사치를 사용했다는 점 참고 바란다.
자 그럼, 이걸 그대로 나열한다면, 0 0000000100000111 010011001100110 이다. 컴퓨터 내부에서 이렇게 소수도 일련의 비트 형식으로 바꾸어 표현되고 저장된다는 것을 알 수 있다.
그런데 만약 정수부의 숫자 크기만 커지거나, 소수부의 범위가 훨씬 더 넓은 연산 값을 처리할려고 할때는 어떨까? 정수부가 크고, 소수점 이하의 수의 범위가 훨씬 작다면, 예를 들어, 0.5 와 같이 이렇게 작다면, 소수부 구현할려고 아껴둔 저 소수 비트들이 아깝지 않은가? 반대로 정수가 만약 4 라고 하고, 소수점 이하의 숫자가 0.21312342... 이런식으로 된다면, 정수부에 배치 해둔 저 정수부 비트들 또한 아깝지 아니한가??
실제로 고정소수점 32bit 기준으로 표현할 수 있는 범위는 아래와 같다.
범위 또한 매우 작지않은가?
이에 맞춰 나온 것이 바로 부동 소수점이다. 아까 설명했던 고정 소수점을 반대로 생각해보자.
소수점을 고정 시켜 실수를 정수와 소수 부분으로 나누어 비트 갯수를 나누는 것이 아닌,
소수점을 유동적으로 위치시키고, 그 위치값과 실제 값(유효 숫자)만을 이용해 소수를 2진수 비트화 시키는 표현 기법이다.
말로만 해서는 못 알아먹는다.
실제 표현 방식을 보면, 위 사진과 같다. 예를 들어, -118.625 라는 실수가 있다면,
일단, 부호를 빼면, 118.625 이고, 이를 1110110.101 로 이진수로 바꿔주고, 1.110110101 로 왼쪽에는 1만 남게 소수점을 옮겨 준다. 이처럼 소수점이 움직인다 하여 부동 소수점(浮動小數點, floating point) 즉, 떠돌아다니는, 둥둥떠서 움직이는 소수점 이라 말한다.
그런 다음, 1110110.101=1.110110101×2⁶ 이고, 이때 110110101 같은 유효 숫자를 가수라고 하고, 6은 소수점을 위치를 가리키므로 지수(指數) 라고 말한다.
이 지수에다가 127 이라는 bias 값을 더한다. 127 이라는 값은 IEEE 754에서 정한 값이고, 왜 127 이라고 물으면, 그래야 표현할 수 있는 소수점 위치 정보의 범위가 8비트내에서 제일 크지 않을까 라는 내 추측을 더해본다.
그래서 소수점 위치정보의 범위는 -127 ~ 128 이 된다.
그리고 이걸 지수부 라는 칸에 8비트 값으로 저장하게된다. 그래서 127 + 6 이닌까 133이 되고 이걸 2진수로 바꾸면, 10000101이 되는 것이다.
나머지는 간단하다. 나머지 소수점 아래 값: 1101101010를 가수부에 채워주고, 나머지 칸들은 다 0으로 채워주면된다.
그럼 최종적으로 11011010100000000000000 이 된다.
이처럼 부동소수점은 소수와 정수 부분으로 따로 나누어서 표현한 것이 아니기에 고정소수점 처럼 비트 칸을 낭비하지 않고, 최대한 활용하여 표현할 수 있는 범위가 훨씬 더 넓어진다.
출처
Computer-Achitecture/04강 CPU의기본구성 및 명령어세트.md at main · Kraken-Addicts/Computer-Achitecture
Computer Architecture Group Study. Contribute to Kraken-Addicts/Computer-Achitecture development by creating an account on GitHub.
github.com
https://www.cheggindia.com/full-forms/alu/
ALU Full Form: Arithmetic Logic Unit
ALU full form is an Arithmetic Logic Unit. ALU performs fundamental arithmetic and logical operations on binary data.
www.cheggindia.com
https://modulabs.co.kr/blog/fixed-points-and-floating-points-how-computers-understand-numbers
고정소수점과 부동소수점 - 컴퓨터가 숫자를 이해하는 방법
실수를 표현하는 방법으로 널리 알려진 고정소수점(fixed-point)과 부동소수점(floating-point)은 각각의 고유한 특징과 용도가 있습니다. 이번 포스트에서는 이 두 가지 방식의 개념을 살펴보고, 실제
modulabs.co.kr
https://ko.wikipedia.org/wiki/%EB%B6%80%EB%8F%99%EC%86%8C%EC%88%98%EC%A0%90
부동소수점 - 위키백과, 우리 모두의 백과사전
위키백과, 우리 모두의 백과사전. 초기의 전기기계식 프로그래밍 가능한 컴퓨터 Z3에는 부동소수점 산술 기능이 포함되었다. (뮌헨의 국립 독일 박물관) 부동소수점(浮動小數點, floating point) 또
ko.wikipedia.org