현재 잘못된내용 현재 잘못된내용 현재 잘못된내용 현재 잘못된내용 현재 잘못된내용
컴퓨터에서는 소수점이 있는 숫자를 표현하는데 두가지 방법이 있다.
각각의 방법은 데이터의 범위, 정밀도, 연산 속도 측면에서 다른 특성을 갖고 있으므로
개념을 이해하고 적합한 방법을 선택하는것이 좋은 선택이 될 수 있다.
고정 소수점
고정 소수점 표현은 소수점이 말그대로 고정되어 있음을 의미한다.
정수부분, 소수 부분의 비율이 미리 정해져 있어 소수점의 위치가 고정되는 것이 특징이다.
예를 들어 고정소수점이 32bit 고정 소수점에서는
0 0000000 00000000 00000000 00000000
0 = 부호비트로 0이면 양수 1이면 음수를 의미한다.
0 = 빨간비트영역은 정수부분을 의미한다. (15bit)
0 = 파란부분은 소수점 이하 부분을 의미한다.(16bit)
미리 소수점의 위치가 결정되었으므로 연산속도가 빠르며
구현과정이 꽤 직관적이라는 장점이 있다.
하지만 미리 소수점이 미리 정해져 있다는 것은 매우 작은수, 큰수를 표현할때 정확한 표현이 어렵다는 단점이 있다.
9.123 의 값을 고정소수점 방식으로 표현해보자.
정수부분과 소수부분을 따로 이진법으로 처리하면 된다.
9 = 0000 1001 로 쉽게 이진수를 구할수 있다. 이 이진수는 정수부분에 그대로 대입해주면 된다.
소수부분의 경우 소수부분을 2씩 계속 곱해가며 나온 결과값의 정수부분을 따오면 된다.
소수 비트가 총 16개 이므로 16번의 연산
0.123 × 2 = 0.246 -> 0
0.246 × 2 = 0.492 -> 0
0.492 × 2 = 0.984 -> 0
0.984 × 2 = 1.968 -> 1
0.968 × 2 = 1.936 -> 1
0.936 × 2 = 1.872 -> 1
0.872 × 2 = 1.744 -> 1
0.744 × 2 = 1.488 -> 1
0.488 × 2 = 0.976 -> 0
0.976 × 2 = 1.952 -> 1
0.952 × 2 = 1.904 -> 1
0.904 × 2 = 1.808 -> 1
0.808 × 2 = 1.616 -> 1
0.616 × 2 = 1.232 -> 1
0.232 × 2 = 0.464 -> 0
0.464 × 2 = 0.928 -> 0
0001111101111100
해당 결과는 0001 1111 0111 1100 로 확인된다. 하지만 위의 과정은 보다시피 근사값을 활용했다는 것을 기억하자.
측 9.123 의 고정소수점의 표현은 0 00000000 0001001 00011111 01111100 의 이진수로 표현되는 것을 알 수 있다.
반대로 이진수에서 십진수의 값을 구할경우
부호비트는 0으로 양수를 확인하였고.
정수부분의 경우 쉽게 파악이 가능하며소수부분은 1로 표기된 비트자리 4,5,6,7,8,10,11,12,13,14 에서2^-4 , 2^-5 , 2^-6 , 2^-7 , 2^-8 , 2^-10 , 2^-11 , 2^-12 , 2^-13 , 2^-14 의 값을 전부 더해주면된다.
2^-4 = 0.0625 +
2^-5 = 0.03125 +
2^-6 = 0.015625 +
2^-7 = 0.0078125 +
2^-8 = 0.00390625 +
2^-10 = 0.0009765625 +
2^-11 = 0.00048828125 +
2^-12 = 0.000244140625 +
2^-13 = 0.0001220703125 +
2^-14 = 0.00006103515625 +
= 0.12298583984375 로 이진수로 변환하고 다시 십진수로 변환의 결과값은 9.12298583984375의 값으로 확인된다.
위의 고정소수점으로 이진수를 바꾸는 과정에서 근사값을 추출하는 과정이 있었고 소수부분이 8비트로만 표현되기때문에 정확한값이 떨어지지 않으며, 오차가 발생될 수 있다는 점을 확인할 수 있다.
부동 소수점
위의 소수점이 고정된 방식과는 달리 부동(floating : 떠다니는) 소수점 방식이 있다.
이는 소수점이 유동적으로 이동하는것을 의미한다.
똑같은 예시로 9.123 을 예로 들어보자.
비트수는 위와 똑같이 32비트의 상황에서 처리한다고 가정해보고싶다.
0 00000000 00000000 00000000 0000000
0 = 부호비트로 0이면 양수 1이면 음수를 의미한다.
0 = 빨간비트영역은 지수부분을 의미한다. (8bit 입니다)
0 = 파란부분은 가수부를 의미한다.(나머지 23bit)
일단은 부동 소수점 방식으로 이진법으로 변환시켜보자.
우선 정수부분 9 이진수는 1001
소수점부분 계산방식은 고정소수점 방식과 같다.
0.123 × 2 = 0.246 (정수 부분 0)
0.246 × 2 = 0.492 (정수 부분 0)
0.492 × 2 = 0.984 (정수 부분 0)
0.984 × 2 = 1.968 (정수 부분 1)
0.968 × 2 = 1.936 (정수 부분 1)
0.936 × 2 = 1.872 (정수 부분 1)
0.872 × 2 = 1.744 (정수 부분 1)
0.744 × 2 = 1.488 (정수 부분 1)
0.488 × 2 = 0.976 (정수 부분 0)
0.976 × 2 = 1.952 (정수 부분 1)
0.952 × 2 = 1.904 (정수 부분 1)
0.904 × 2 = 1.808 (정수 부분 1)
0.808 × 2 = 1.616 (정수 부분 1)
0.616 × 2 = 1.232 (정수 부분 1)
0.232 × 2 = 0.464 (정수 부분 0)
0.464 × 2 = 0.928 (정수 부분 0)
0.928 × 2 = 1.856 (정수 부분 1)
0.856 x 2 = 1.712 (정수 부분 1)
0.712 x 2 = 1.424 (정수 부분 1)
0.424 x 2 = 0.848 (정수 부분 0)
0.848 x 2 = 1.696 (정수 부분 1)
0.696 x 2 = 1.392 (정수 부분 1)
0.392 x 2 = 0.784 (정수 부분 0)
결과값은 0 00001001 00011111 01111100 1110110
위와 같은 형식으로 이루어진 가수부가 23개의 bit값이 채워질것이다.
여기서 부동소수점의 특성으로 지수부와 가수부 사이에서 가장 왼쪽에 있는 숫자 오른쪽으로 소수점을 이동시킨다.
0 00001001.00011111 여기에서
0 00001 . 00100011111 여기로!
소수점이 왼쪽으로 3칸 이동하게 됐다.
위의 근사값을 정규화 시켜보면
1.00011111011111001110110 × 2^(-3) 으로 표현하게 된다.
'CS' 카테고리의 다른 글
2의 보수 (0) | 2024.07.14 |
---|---|
컴퓨터의 사칙연산 (보수법의 필요성) (0) | 2024.07.14 |
16진수 표기는 어디에 사용될까 (0) | 2024.07.01 |
bit 비트란 (0) | 2024.06.28 |
데이터 - 0과 1로 문자를 표기하는 방법 (0) | 2024.06.26 |