Computer - Number

[TOC]

정수

캐리와 오버플로우

음수의 표현

양수를 2의 보수로 만들면 음수가 된다.

2의 보수 만들기
  1. 모든 비트의 값을 반전
  2. 1을 더한다.
100001114bit의 자료형에서 2의 보수 만들기비트 반전+110017최상위 비트는 음수로 취급-8-77의 2의 보수는 -74bit
2의 보수가 음수인지 확인
4bit의 자료형에서 2의 보수가 음수인지 확인1001-77011100000(7의 2의 보수)14bit4bit5bit4번째 비트에서 자리올림(Carry)이 발생하여 5번째 비트가 1이됐다.4bit까지만 표현할 수 있기 때문에 5번째 bit는 사라진다(무시된다).1001-730011-4110004bit4bit4bit4번째 비트에서 자리올림(Carry)이 발생하지 않았다.어쨌든 5번째 비트는 무시된다.5bit4bit(7의 2의 보수)-7 + 7 = 0-7 + 3 = 4

소수

고정소수점

고정소수점은 숫자의 정수부와 소수부를 고정된 영역에 기록하는 방식이다.

고정소수점으로 변환
  1. 여기서는 8bit의 공간에 저장하기로 한다.
  2. 앞의 4bit는 정수부, 뒤의 4bit는 소수부로 사용하기로 한다.
  3. 11.375를 이진수로 변환한다.
    1. 정수 1을 이진수로 변환
      1. 더 이상 2로 나누어지지 않을 때가지 나눈다.
      2. 2로 나눌 때마다 생기는 나머지를 최하위 비트부터 차례대로 써준다.
      3. 마지막에 0 또는 1이 남으면 종료.
      4. 비어있는 비트는 0으로 채운다.
    2. 소수 0.375를 이진수로 변환
      1. 0이 될때까지 2를 곱한다.
      2. 2로 곱한 수의 정수부분을 최상위 비트부터 차례대로 써준다.
      3. 정수부분을 비트에 쓴 후 정수부분을 0로 바꾼다.
      4. 0이 되면 종료하고 0이 안되면 자료형이 허용하는 범위까지 계속 반복한다.
        1. 끝자리가 5가 아니면 무한소수가 된다.
        2. 10진법으로 무한소수가 아닌 수가 2진법으로 변경 시 무한소수가 될 수 있다.
고정소수점 방식으로 8bit의 자료형에 11.375를 저장하기11251나머지1나머지를 위에서부터 최하위 비트에 써준다.101122011더 이상 2로 나눌 수 없으므로 종료정수부분 11을 2진수로 변환더 이상 나누어지지 않을 때까지 2로 나누어준다.0.375x20110x2정수부분의 숫자를 최상위비트부터 적어주고0으로 만든다.소수부분 0.375를 2진수로 변환0이 될때까지 2를 곱해준다.0.7500.7501.500x20.5001.0000.0000이 됐으므로 종료01102진수로 변환된 정수와 소수1011정수부소수부빈자리는 0으로 채운다8Bit
고정소수점에서 10진수로 변환
  1. 정부부분은 각 비트와 2의 (자릿수-1) 제곱
  2. 소수부분은 각 비트와 2의 자릿수 제곱 분의 1
  3. 각 비트별 계산 결과를 모두 합해준다.
고정소수점 방식으로 저장된 2진수를 10진수로 변환하기01101011정수부소수부8Bit

부동소수점

부동소수점 자료형
이름 타입 크기 특징
반정밀도 부동소수점 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에서의 구조

-11.375를 부동소수점으로 변환
  1. 음수이므로 1을 부호비트에 저장한다.
  2. 부호를 제외한 수를 고정소수점과 같은 방식으로 2진수로 만들면 1011.0110이 된다.
  3. 정수부분이 1이 되도록 소수점을 앞으로 3번 이동 시킨다. 이동 횟수가 지수부분이 되고 숫자를 다음과 같이 나타낼 수 있다.
    1. 1011.0110 = 2³ x 1.0110110
  4. Bias를 계산하면 127이 된다.
  5. Bias와 지수를 더하고 이진수로 변환한 뒤 지수부 비트에 저장한다.
    1. 3 + 127 = 130 => 10000010
  6. 가수부분에서 소수점 부분을 가수부 비트에 저장한다.
부동소수점 float에 -11.375 저장하기01101011정수부소수부(고정소수점과 같은 방식)11.37511.375를 2진수로 변환01101011정수부의 끝에 있는 1까지 소수점 3칸 이동123000000000000float 자료형(32bit)0000부호(1비트)지수(8비트)가수(23비트)0000000000000000132561234875610111213141516171819123489720212223-11.375는 음수이므로 부호비트에 1저장Bias 계산1011.0110 = 2³ x 1.0110110Bias 127과 지수 3을 합하여 지수부에 저장3+127=1301000 001000000000000011001000000000000000가수부 1.0110110에서 소수부분만 저장0001101100001100100000000000000000000000000010000000000000000000∴ 지수 = 3 부동소수점 자료형에서 숫자 꺼내오기00011011000011001000000000000000Bias 계산지수부 10진수로 변환1301000 0010지수 = 130-127 = 32³ x 1.0110110지수부와 가수부로 식만들기1011.0110소수점 옮기기11.37510진수로 변환-11.375부호 비트가 1이므로 음수지수부와 바이어스를 빼서 지수 구하기

부동소수점의 특수한 수

지수 부분 가수 부분 0 가수 부분 0이외
0 +-0 비정상 값
최댓값 +- 무한대 NaN(Not a Number)

부동소수점의 오차

유효숫자 누락

서로 가까운 두 값끼리 뺀 결과가 양수이면서 1보다 작을 때 비트 수전에서 유효 숫자가 적어지는 것

빼고 나온 결과 값은 더 정밀한 숫자를 표현 할 수 있는데 원래 수에서 표현 가능한 범위의 제한으로 인해 더 정밀하게 표한하지 못하는 것

정보 누락

두 값중 하나는 매우 크고 다른 하나는 매우 작을 때 발생하여 작은값이 무시되는 오차이다.

표현하는 값이 다를 경우 가수부분의 끝이 의미하는 숫자가 달라지는데 매우 큰 수의 끝자리가 매우 작은 수의 끝자리보다 클 경우 매우 작은 수의 끝자리를 표현할 수 없으므로 무시된다.

정수에서 부동소수점으로 변환(캐스트)

정수가 매우 큰 경우 부동소수점의 가수부의 끝자리도 커지는데 이 때 정수의 정밀도보다 가수부 끝자리의 정밀도가 떨어지는 경우 정수값을 정확히 부동소수점으로 변경할 수 없게 된다.