[TOC]
정수
캐리와 오버플로우
- 캐리(Carry)
- 2의 보수와의 연산 결과 MSB(Most Significant Bit - 최상위 비트)에서 자리올림이 발생했고 자료형이 나타낼 수 있는 범위를 넘어선 비트는 무시된다.
- 오류가 아니다.
- 오버플로우(Overflow)
- 연산 결과 MSB(Most Significant Bit - 최상위 비트)에서 자리올림이 발생했고 자료형이 나타낼 수 있는 숫자 범위를 넘어섰다
- 오류다.
음수의 표현
양수를 2의 보수로 만들면 음수가 된다.
2의 보수 만들기
- 모든 비트의 값을 반전
- 1을 더한다.
2의 보수가 음수인지 확인
소수
고정소수점
고정소수점은 숫자의 정수부와 소수부를 고정된 영역에 기록하는 방식이다.
고정소수점으로 변환
- 여기서는 8bit의 공간에 저장하기로 한다.
- 앞의 4bit는 정수부, 뒤의 4bit는 소수부로 사용하기로 한다.
- 11.375를 이진수로 변환한다.
- 정수 1을 이진수로 변환
- 더 이상 2로 나누어지지 않을 때가지 나눈다.
- 2로 나눌 때마다 생기는 나머지를 최하위 비트부터 차례대로 써준다.
- 마지막에 0 또는 1이 남으면 종료.
- 비어있는 비트는 0으로 채운다.
- 소수 0.375를 이진수로 변환
- 0이 될때까지 2를 곱한다.
- 2로 곱한 수의 정수부분을 최상위 비트부터 차례대로 써준다.
- 정수부분을 비트에 쓴 후 정수부분을 0로 바꾼다.
- 0이 되면 종료하고 0이 안되면 자료형이 허용하는 범위까지 계속 반복한다.
- 끝자리가 5가 아니면 무한소수가 된다.
- 10진법으로 무한소수가 아닌 수가 2진법으로 변경 시 무한소수가 될 수 있다.
- 정수 1을 이진수로 변환
고정소수점에서 10진수로 변환
- 정부부분은 각 비트와 2의 (자릿수-1) 제곱
- 소수부분은 각 비트와 2의 자릿수 제곱 분의 1
- 각 비트별 계산 결과를 모두 합해준다.
부동소수점
부동소수점 자료형
| 이름 | 타입 | 크기 | 특징 |
|---|---|---|---|
| 반정밀도 부동소수점 | half | 2Byte(16Bit) | 메모리 적게 사용 표현 범위 좁음 표준에서 사용할 수없음 |
| 단정밀도 부동소수점 | float | 4Byte(32Bit) | 속도, 정밀도 면에서 많이 사용 |
| 배정밀도 부동소수점 | double | 8Byte(64Bit) | 메모리 많이 사용 정밀도가 높다 속도가 느리다 |
IEEE 754
부동소수점을 컴퓨터에서 표현하기 위해 개발한 방식이 IEEE 754 방식이다.
이 방식으로는 소수와 함께 무한, 비수(Not a Number) 등을 표현 할 수 있다.
IEEE 754는 수를 다음과 같이 가수와 밑과 지수의 관계로 나타낸다.
\(\begin{gather*} 가수\times 밑^{지수}\\ 예) \ 13.75=1.375\times 10^{1}\\ 가수\ :\ 1.375\\ 밑\ :\ 10\\ 지수\ :\ 1 \end{gather*}\) 이렇게 수를 표현하면 소수점의 위치가 이동한다.
이를 부동이라 하는데 부동은 浮動으로 “고정되어 있지 않고 움직임” 또는 “떠서 움직임” 이란 뜻이다.
소수점이 움직인다는 뜻에서 이름이 부동소수점인 것이다.
컴퓨터는 2진수로 저장하기 때문에 밑이 2로 고정된다.
IEEE 754의 구조
4byte float에서의 구조
- 부호부
- 부호를 정하는 비트
- 할당 : 1bit
- 양수 : 0
- 음수 : 1
- 지수부
- 지수를 저장하는 비트부
- 할당 : 8bit
- 바이어스(Bias)
- 지수를 지수부에 넣을 때 바이어스값과 더해서 넣고 꺼낼 때는 빼서 꺼낸다.
- 바이어스 계산 공식
- 2^(n-1)-1
- n : 지수부 비트단위
- float의 바이어스
- 2^(8-1)-1 = 127
- 지수가 3이라면 130이 저장되고 -3이라면 124가 저장된다.
- 2^(n-1)-1
- 가수부
- 가수를 저장하는 비트부
- 할당 : 23bit
- 가수에서 소수점 부분을 저장한다.
- 비트 자리수를 넘어가는 수는 제거되고 모자라면 0으로 채운다.
-11.375를 부동소수점으로 변환
- 음수이므로 1을 부호비트에 저장한다.
- 부호를 제외한 수를 고정소수점과 같은 방식으로 2진수로 만들면 1011.0110이 된다.
- 정수부분이 1이 되도록 소수점을 앞으로 3번 이동 시킨다. 이동 횟수가 지수부분이 되고 숫자를 다음과 같이 나타낼 수 있다.
- 1011.0110 = 2³ x 1.0110110
- Bias를 계산하면 127이 된다.
- Bias와 지수를 더하고 이진수로 변환한 뒤 지수부 비트에 저장한다.
- 3 + 127 = 130 => 10000010
- 가수부분에서 소수점 부분을 가수부 비트에 저장한다.
부동소수점의 특수한 수
| 지수 부분 | 가수 부분 0 | 가수 부분 0이외 |
|---|---|---|
| 0 | +-0 | 비정상 값 |
| 최댓값 | +- 무한대 | NaN(Not a Number) |
부동소수점의 오차
유효숫자 누락
서로 가까운 두 값끼리 뺀 결과가 양수이면서 1보다 작을 때 비트 수전에서 유효 숫자가 적어지는 것
빼고 나온 결과 값은 더 정밀한 숫자를 표현 할 수 있는데 원래 수에서 표현 가능한 범위의 제한으로 인해 더 정밀하게 표한하지 못하는 것
정보 누락
두 값중 하나는 매우 크고 다른 하나는 매우 작을 때 발생하여 작은값이 무시되는 오차이다.
표현하는 값이 다를 경우 가수부분의 끝이 의미하는 숫자가 달라지는데 매우 큰 수의 끝자리가 매우 작은 수의 끝자리보다 클 경우 매우 작은 수의 끝자리를 표현할 수 없으므로 무시된다.
정수에서 부동소수점으로 변환(캐스트)
정수가 매우 큰 경우 부동소수점의 가수부의 끝자리도 커지는데 이 때 정수의 정밀도보다 가수부 끝자리의 정밀도가 떨어지는 경우 정수값을 정확히 부동소수점으로 변경할 수 없게 된다.