909 Devlog

[컴퓨터 구조] - 컴퓨터 산술과 논리 연산 본문

Computer Science/컴퓨터 구조

[컴퓨터 구조] - 컴퓨터 산술과 논리 연산

구공구 2023. 10. 8. 07:08
728x90

👋 본 글은 "컴퓨터 구조론" 책을 읽고 요약, 정리한 글입니다.


책 구매 링크에서 책을 확인하실 수 있습니다.

 

3장에서는 컴퓨터 산술 및 논리 연산장치인 ALU의 내부 조직에 대해 공부하고, 그 장치가 수행하고 다루는 수의 표현 방법과 산술 및 논리 연산에 대하여 설명한다.

 

🎯 1. ALU의 구성 요소


ALU는 수치 및 논리 데이터에 대하여 실제적으로 연산을 수행하는 하드웨어 모듈이다. 다음 요소들은 그 ALU의 구성 요소들이다.

  • 산술 연산장치 : 산술 연산들(+, -, x, %)을 수행
  • 논리 연산장치 : 논리 연산들(AND, OR, NOT, XOR)을 수행
  • 보수기(complementer) : 2진 데이터를 2의 보수로 변환(음수화)
  • 시프트 레지스터(shift register) : 비트들을 좌측 혹은 우측으로 이동시키는 기능을 가진 레지스터
  • 상태 레지스터(status register) : 연산 결과의 상태를 나타내는 플래그들을 저장하는 레지스터

데이터들은 레지스터 / 기억장치로부터 ALU로 입력되고, 그 결과는 일반적으로 레지스터의 어딘가에 저장된다.

ALU는 연산의 결과에 따라 상태 레지스터 내의 해당 플래그들을 세트 하는데, 이 플래그들은 조건 분기 명령어 / 산술 명령어들에 의해 사용된다.

입력 데이터에 대하여 연산을 수행할 내부 요소의 선택과 ALU 내외로의 데이터 이동을 제어하는 신호는 제어 유닛으로부터 제공된다.

 

🎯 2. 정수의 표현


2진수 체계 : 0, 1, 부호 및 소수점으로 수를 표현

예) -13.625₁₀ = -1101.101₂

 

2진수 체계에서 양수를 표현하는 방법은 모두 같지만, 음수를 표현하는 방법은 3가지가 있다.

모든 방법들에서 공통적인 것은 2진수의 맨 좌측 비트가 부호 비트로 사용된다는 점을 알아두자

  • 부호화-크기 표현
  • 1의 보수 표현
  • 2의 보수 표현

하나씩 살펴보자

 

📌 2 - 1. 부호화-크기 표현

맨 좌측 비트는 부호 비트, 나머지 n - 1개의 비트들은 수의 크기를 나타내는 표현 방식

예)

+35

0 0 1 0 0 0 1 1

-35

1 0 1 0 0 0 1 1

첫 비트 0(+), 1(-)은 부호, 0100011은 35의 절댓값을 나타냄

 

부호화-크기 표현의 단점으로는

  • 덧셈과 뺄셈을 수행하기 위해서는 부호 비트와 크기 부분을 변도로 처리해야 함
  • 0에 대한 표현이 두 개 존재 (00000000 = +0, 10000000 = -0)

📌 2 - 2. 보수 표현

  • 1의 보수
    • 부호화-크기 표현으로 나타낸 수의 비트들을 부호 부분을 제외하고 모두 반전
    • 예) -35 = 11011100
    • 범위 : -(2ⁿ - 1) ~ +(2ⁿ - 1) (ⁿ은 비트 수를 의미함)
  • 2의 보수
    • 1의 보수 표현에 1을 더함
    • 예) -35 = 11011101
    • 범위 : -2ⁿ ~ +(2ⁿ - 1) (ⁿ은 비트 수를 의미함)

📌 2 - 3. 부호-비트 확장

데이터의 길이(비트 수)를 늘리는 방법

  • 목적 : 데이터를 더 많은 비트의 레지스터에 저장하거나 더 긴 데이터와의 연산 수행

8-비트 길이의 부호화-크기 표현을 16-비트 길이로 확장하려면

부호비트를 가장 좌측으로 옮기고 나머지 비트를 모두 0으로 채운다

예)

+21 =                 00010101 (8-비트 부호화-크기 표현)

+21 = 0000000000010101 (16-비트 부호화-크기 표현)

-21 =                 10010101 (8-비트 부호화-크기 표현)

-21 = 1000000000010101 (16-비트 부호화-크기 표현)

 

8-비트 길이의 2의 보수 표현을 16-비트 길이로 확장하려면

확장되는 상위 비트들을 모두 부호 비트와 같은 값으로 세트 한다

이를 부호-비트 확장이라 한다.

예)

+21 =                 00010101 (8-비트 2의 보수 표현)

+21 = 0000000000010101 (16-비트 2의 보수 표현)

-21 =               11101011 (8-비트 2의 보수 표현)

-21 = 1111111111101011 (16-비트 2의 보수 표현)

 

🎯 3. 논리 연산


다음 그림은 두 개의 비트 A와 B에 대하여 처리될 수 있는 기본적이 논리 연산들이다.

비트 단위의 논리 연산들을 위한 하드웨어 모듈은 4X1 MUX 등으로 만들 수 있다. 여러 비트의 경우 4X1 MUX를 여러 개 이용하여 각각의 MUX에 공통으로 연산 선택 신호를 인가하는 방식으로 만들 수 있다.

아래 그림은 논리 연산을 위한 하드웨어 모듈이다.

하드웨어의 구성

  • 입력 비트(A, B)들은 모든 논리 게이트들을 통과
  • 선택 신호(S1, S2)들에 대하여 멀티플렉서의 네 입력들 중의 하나

위에서 말했듯 여러 비트의 경우 4X1 MUX를 여러 개 이용한다 (기본 논리 모듈들을 병렬로 접속)

아래 그림은 4-비트일 때 그 모습을 나타낸 그림이다.

 

이제 논리 연산에 대해 알아보자면

  • AND 연산 : 두 데이터 단어들의 대응되는 비트들 간에 AND 연산(둘 다 1일 때 1)을 수행

  • OR 연산 : 두 데이터 단어들의 대응되는 비트들 간에 OR 연산(어느 하나라도 1이면 1) 수행

  • XOR 연산 : 두 데이터 단어들의 대응되는 비트들 간에 exclusive-OR 연산(다르면 1) 을 수행

  • NOT 연산 : 데이터 단어의 모든 비트들을 반전

  • 선택적-세트 연산 : B 레지스터의 비트들 중에서 1로 세트 된 비트들과 같은 위치에 있는 A 레지스터의 비트들을 1로 세트 (OR 연산 이용)

  • 선택적-보수 연산 : B 레지스터의 비트들 중에서 1로 세트 된 비트들에 대응되는 A 레지스터의 비트들을 보수로 변환 (XOR 연산 이용)

  • 마스크 연산 : B 레지스터의 비트들 중에서 0인 비트들과 같은 위치에 있는 A 레지스터의 비트들을 0으로 바꾸는 연산(AND 연산 이용)
    • 용도 : 단어 내의 원하는 비트들을 선택적으로 clear 하는 데 사용

  • 삽입 연산 : 새로운 비트 값들을 데이터 단어 내의 특정 위치에 삽입
    • 삽입할 비트 위치들에 대하여 마스크 연산 수행
    • 새로 삽입할 비트들과 OR 연산 수행

  • 비교 연산
    • A와 B 레지스터의 내용을 비교 ➡️ XOR 연산
      • 만약 대응되는 비트들의 값이 같으면, A 레지스터의 해당 비트를 0으로 세트
      • 만약 서로 다르면, A 레지스터의 해당 비트를 1로 세트
      • 모든 비트들이 같으면 Z 플래그를 1로 세트

 

🎯 4. 시프트 연산


시프트 연산은 시프트 레지스터 내의 데이터를 연산한다.

 

  • 논리적 시프트 : 레지스터 내의 데이터 비트들을 왼쪽 혹은 오른쪽으로 한 칸씩 이동
    • 좌측 시프트
      • 모든 비트들을 좌측으로 한 칸씩 이동
      • 최하위 비트로는 "0"이 들어오고, 최상위 비트는 버림(drop-out)
    • 우측 시프트
      • 모든 비트들을 우측으로 한 칸씩 이동
      • 최상위 비트로 "0"이 들어오고, 최하위 비트는 버림(drop-out)

 

아래 그림은 좌측 시프트를 나타내는 그림이다.

아래 그림은 시프트 기능을 가진 레지스터의 내부 회로이다.

좌측 시프트일 경우 L = 1, R = 0

 

  • 순환 시프트
    • 회전이라고도 부르며, 최상위 혹은 최하위에 있는 비트를 버리지 않고 반대편 끝에 있는 비트위치로 이동
      • 순환 좌측-시프트 : 최상위 비트가 최하위 비트 위치로 이동
      • 순환 우측-시프트 : 최하위 비트가 최상위 비트 위치로 이동

아래 그림은 순환 좌측-시프트를 나타내는 그림이다.

 

 

논리적 시프트 연산과 순환 시프트 연산을 이용하면, 두 레지스터들 간에 직렬 데이터 전송이 가능해진다.

직렬 데이터 전송 : 시프트 연산을 데이터 비트 수만큼 연속적으로 수행함으로써 두 레지스터들 사이에 한 개의 선을 통하여 전체 데이터를 이동(복사)하는 동작

아래 그림은 직렬 데이터 전송을 나타낸다.

다음 표와 같은 흐름으로 직렬 데이터 전송이 이루어진다.

  A4 A3 A2 A1 B4 B3 B2 B1
초기상태 1 0 1 1 0 0 0 0
t1 1 1 0 1 1 0 0 0
t2 1 1 1 0 1 1 0 0
t3 0 1 1 1 0 1 1 0
t4 1 0 1 1 1 0 1 1

 

  • 산술적 시프트 연산
    • 수(number)를 나타내는 데이터에 대한 시프트
    • 방법 : 시프트 과정에서 부호 비트는 그대로 유지시키고, 수의 크기를 나타내는 비트들만 시프트
      • 산술적 좌측-시프트 : 최상위 비트를 그대로 유지시키고, 논리적 좌측-시프트 수행
      • 산술적 우측-시프트 : 최상위 비트를 그대로 유지시키고, 논리적 우측-시프트 수행

A = 1110 (-2)에 대한 산술적 시프트 예시

초기상태 1 (고정) 1 1 0 (-2)
t1 - 산술적 좌측-시프트 수행 결과 1 (고정) 1 0 0 (-4)
t2 - 산술적 우측-시프트 수행 결과 1 (고정) 1 1 0 (-2)
t3 - 산술적 우측-시프트 수행 결과 1 (고정) 1 1 1 (-1)

산술적 좌측-시프트를 수행하면 원래 숫자에 곱하기 2를 한 결과가 나오고,

산술적 우측-시프트를 수행하면 원래 숫자에 나누기 2를 한 결과가 도출된다.

 

  • C 플래그를 포함한 시프트 연산
    • C 플래그를 포함한 좌측-시프트(SHLC)
    • C 플래그를 포함한 우측-시프트(SHRC)

  • C 플래그를 포함한 순환 시프트 연산
    • C 플래그를 포함한 좌측 순환 시프트 연산
    • C 플래그를 포함한 좌측 순환 시프트 연산  

 

🎯 5. 정수의 산술 연산


📌 5 - 1. 덧셈

  • 2의 보수로 표현된 수들의 덧셈 방법
    • 두 수를 더하고, 만약 올림수가 발생하면 버림 (ex. 1101 + 0011 = 0000 (-3 + 3 = 0))
    • 그런데, 올림수를 버리면 문제가 발생하기도 함 (ex. 0110 + 0011 = 1001 (6 + 3 = -7))
    • 이 문제를 오버플로우라고 부름

이러한 덧셈을 수행하는 하드웨어는 병렬 가산기라고 부른다

  • 덧셈을 수행하는 하드웨어 모듈
  • 비트 수만큼의 전가산기(full-adder, FA)들로 구성
  • 덧셈 연산 결과에 따라 해당 조건 플래그(condition flags)들을 세트 : 상태 레지스터(SR)
    • S 플래그 : 부호
    • Z 플래그 : 0 (모든 비트가 0)
    • C 플래그 : 올림수
    • V 플래그 : 오버플로우

아래 그림은 4-비트 병렬 가산기와 상태 비트 제어회로이다.

각 FA 마다 자리에 맞는 비트를 넣고, 최하위 비트에 기본 올림수 0을 넣고 연산을 시작한다.

마지막 FA의 연산결과는 S1로 내리고, 연산 중에 올림수(C1)가 생겼다면 1을, 없다면 0을 다음 FA에 추가한다.

 

두 번째 FA에 자리에 맞는 비트와 이전 연산에서 올라온 올림수를 모두 더하고 결과를 S2에 내리고, 올림수를 다음 연산에 전달한다.

 

세 번째 FA는 자리에 맞는 비트와 올림수를 모두 더해 결과를 S3에 내리고 올림수(C3)을 다음 FA에 넘기는데

해당 올림수(C3)을 V(오버플로우 상태 레지스터)를 연산하기 위해 XOR에도 넘긴다.

 

마지막 FA는 자리에 맞는 비트와 올림수를 모두 더해 결과를 S4와 S(부호 상태), C(올림수 검출)에 넘기고 V(오버플로우)를 검출하기위해 XOR에 올림수를 넘겨 C3과 C4를 비교하여 XOR 연산 결과를 V에 저장한다.

 

이제 모든 결과 (S1, S2, S3, S4)를 모아 NOR 연산을 한다. 만약 모든 비트가 0이면 Z(연산 결과가 0임을 나타내는 비트)에 1을 전달하고 연산이 끝나게 된다.

 

덧셈 오버플로우

  • 덧셈 결과가 그 범위를 초과하여 결과값이 틀리게 되는 상태
  • 검출 방법 : 두 올림수들 간의 XOR을 이용
  • V = C₄ XOR C₃

📌 5 - 2. 뺄셈

덧셈을 이용하여 수행

  • (A : 피감수, B : 감수)
  • ex). A - B = A + (-B)
  • ex). A - (-B) = A + B

피감수에 해당하는 B (B 레지스터)의 값을 보수기를 거쳐 - 작업을 거친 뒤

병렬 가산기를 거쳐 덧셈 작업을 수행한다.

 

연산 방법 자체는 덧셈과 같다.

 

보수기를 거칠 때 제어 신호가 0이 들어간다면 +, 1이 들어간다면 -이다.

따라서 0이 들어가면 보수 작업을 거치지 않고 그냥 통과할 것이고, 1이 들어가면 보수 작업을 거치게 될 것이다.

 

뺄셈 오버플로우

  • 뺄셈 결과가 그 범위를 초과하여 결과값이 틀리게 되는 상태
  • 검출 방법 : 덧셈과 동일 (V = C₄ XOR C₃)

📌 5 - 3. 곱셈

방법

  • 각 비트에 대하여 부분 적계산
  • 부분 적들을 모두 더하여 최종 결과를 얻음

13 * 11 연산의 예

위 부분 적들은

1101 * 1

1101 * 1

1101 * 0

1101 * 1

(사이클 4번 = 1101의 길이 = 4)

을 해서 나온 결과이다.

 

13 * 11을 했을 때

13 * 1

13 * 10

(사이클 2번 = 11의 길이 = 2)

과 같다.

 

최종 결과는 위 부분 적들을 모두 더해서 답을 구한다.

위 연산을 했을 때 4비트끼리 연산을 했는데 그러면 연산결과는 4 + 4 = 8 비트를 넘지 않는다.

 

위 곱셈 알고리즘을 수행하는 하드웨어 구성은 다음과 같다.

M에는 피승수, Q에는 승수를 저장하고

C는 0, A 레지스터는 0000으로 초기화를 한 후에 연산을 시작한다.

 

해당 연산의 결과는 A와 Q를 연결한 8비트로 표현한다.

 

오른쪽의 제어 회로는 부분 적들을 여러 번 만들어내기 위해 필요하고

제어 회로에는 Q 레지스터의 최하위비트 (LSB)가 들어간다

 

아래 연산 과정을 보면서 자세한 알고리즘을 살펴보자.

 

다음 그림은 위 하드웨어 구성을 사용해 곱셈이 수행되는 과정에서의 레지스터의 내용들을 보여주고 있다.

위 사이클을 4번 도는 이유는, 승수가 4비트이기 때문

 

사이클을 돌 때 마다 Q 레지스터의 마지막 비트를 제어회로에 보내 검사한다.

Q 레지스터의 마지막 비트가 1이라면, A에 M을 더하고 C와 A, Q를 하나로 보고 우측 시프트를 한다.

 

만약 Q 레지스터의 마지막 비트가 0이라면 M을 더하지 않고 우측 시프트만 수행한다.

 

A + M 연산중에 올림수가 나오면 C에 저장하고,

모든 사이클이 끝나게 되면 A와 Q를 합친 AQ가 곱셈 연산의 결과가 된다.

 

 

2의 보수(부호 있는 정수)들 간의 곱셈

  • Booth 알고리즘을 사용
  • 하드웨어 구성
    • 부호없는 정수 승산기의 하드웨어에 다음 부분을 추가
      • M 레지스터와 병렬 가산기 사이에 보수기 추가
      • Q 레지스터 우측에 Q₋₁이라고 부르는 1-비트 레지스터를 추가하고, 출력을 Q0와 함께 제어 회로로 입력(Q0 Q₋₁)

 

2의 보수들 간의 곱셈은 상당히 복잡하기 때문에 특별한 알고리즘이 개발되어 있음, 아래는 가장 널리 사용되는 Booth 알고리즘

-7 * 3의 연산 과정을 통해 자세하게 알아보자

M은 피승수, Q는 승수이고 A와 Q-1은 각각 0000과 0으로 초기화를 하고 연산을 시작한다.

 

매 사이클 마다 Q 레지스터의 마지막 비트(Q0)와 Q-1을 검사한다.

만약 Q0과 Q-1이 10 이라면 A에 M을 빼고 (A + (-M)) 산술적 우측-시프트를 수행한다

만약 11 또는 00이라면 그냥 산술적 우측-시프트를 하고

만약 01이라면 A에 M을 더하고 (A + M) 산술적 우측-시프트를 수행한다.

 

모든 사이클이 다 끝난 뒤에 A와 Q를 합친 AQ가 연산의 결과가 된다.

 

 

📌 5 - 4. 나눗셈

 

나눗셈은 곱셈보다 다소 더 복잡하지만 같은 원리에 근거를 두고 있다.

즉, 곱셈과 마찬가지로 반복적인 시프트와 덧셈 또는 뺄셈으로 이루어진다.

 

  • 나눗셈의 수식 표현
    • A % B = q ... r
    • A : 피제수, B : 제수, q : 몫, r : 나머지 수
  • 부호 없는 2진 나눗셈

147 % 11의 예

아래 그림은 부호 없는 2진 나눗셈의 알고리즘 흐름도이다. (중간에 X가 표시되어 있는 선은 그림 오류임)

유의할 점은 곱셈과는 다르게 좌측-시프트를 수행한다.

 

M는 제수, Q는 피제수, A를 0000으로 세팅하고 연산을 시작한다.

 

매 사이클마다 좌측-시프트를 수행하고, A에 M을 뺀다 (A + (-M))

연산 결과인 A가 0보다 작다면 나눗셈을 수행할 수 없다는 의미이니 Q 레지스터의 마지막 비트(Q0)을 0으로 세트하고 A에 M을 더한다.

연산 결과가 0과 같거나 크다면 나눗셈을 수행할 수 있다는 의미이니, Q0을 1로 세트한다.

 

최종적으로 목은 Q 레지스터에, 나머지는 A 레지스터에 남게 된다.

 

위 알고리즘을 약간 수정하면 제수나 피제수가 음수인 경우에도 적용할 수 있다.

아래 그림은 나눗셈 과정을 단계별로 나누어 설명한 그림이다.

 

7 % -3의 연산 과정을 통해 자세히 알아보자

M은 승수, Q는 피승수이고 A를 0000으로 초기화시킨 뒤 연산을 시작한다.

 

매 사이클마다 좌측-시프트를 수행하고 A와 M의 부호를 검사한다

 

만약 A와 M의 부호가 같다면 A에 M을 빼고 (A + (-M)), 부호가 다르다면 A에 M을 더한다 (A + M)

 

위 연산 전후로 A의 부호가 같거나 0이면, 연산 성공이므로 Q 레지스터의 마지막 비트 (Q0)를 1로 세트한다.

연산 전후로 A의 부호가 달려졌다면 연산 실패이므로 Q0을 0으로 세트하고 A를 연산 전 값으로 되돌린다.

 

모든 사이클을 돈 후에, 나머지는 A에 남고, 제수와 피제수의 부호가 같다면 몫은 Q 레지스터의 값이 되고, 부호가 다르다면 Q의 2의 보수가 답이 된다. 

 

🎯 6. 부동소수점 수의 표현


부동소수점 표현 : 소수점의 위치를 이동시킬 수 있는 수 표현 방법 ➡️ 수 표현 범위 확대

 

부동소수점 수의 일반적인 형태는 아래 그림과 같다.

S : 부호, M : 가수, E : 지수, B : 기수

 

부동소수점 형식의 예는 다음과 그림과 같다.

 

부동소수점 표현 : 정규화

  • 10진 부동소수점 수
    • 274, 000, 000, 000, 000 = (-1)⁰ 2.74 * 10¹⁴
    • -0.00000000000274 = (-1)¹ 2.74 * 10⁻¹²
  • 2진 부동소수점 수
    • 기수 B = 2

 

같은 수에 대한 부동소수점 표현

  • 같은 수에 대한 부동소수점 표현이 여러 가지가 존재
    • 0.1101 * 2⁵
    • 11.01 * 2³
    • 0.001101 * 2⁷
  • 정규화된 표현
    • 수에 대한 표현을 한 가지로 통일하기 위한 방법
      • +- 0.1bbb...b * 2E
    • 위의 예에서 정규화된 표현은 0.1101 * 2⁵

 

단일-정밀도 부동소수점 수 형식의 예

에서 S : 1 비트, E : 8 비트, M : 23 비트

  • 지수(E) 필드의 비트 수를 증가시킨다면 ➡️ 표현 가능한 수의 범위 확장
  • 가수(M) 필드의 비트 수를 증가시킨다면 ➡️ 정밀도(precision) 증가

0.1101 * 2⁵의 경우일 때 데이터 표현은 다음과 같다.

부호 비트 (S)에는 양수이니 0을 저장하고

또, 지수 필드인 E에는 5에 바이어스(128)을 더한 값을 저장하고

마지막으로 가수필드인 M에는 소수점 이후의 수들을 저장하게 되는데, 정규화를 통해 소수점 바로 뒤의 숫자는 무조건 1이니 해당 1을 생략하고 저장한다. (위 그림에서는 그냥 저장함)

 

1비트를 생략하면 가수 23 비트를 이용하여 소수점 아래 24 자리 수 까지 표현 가능하다.

 

바이어스 된 지수

  • 지수를 바이어스 된 수로 표현
  • 사용 목적
    • 0에 대한 표현에서 모든 비트들이 0이 되게 하여, 0-검사가 용이하게 하기 위함 ➡️ 0-검사가 정수에서와 같은 방법으로 가능해짐

0-검사 : 정확히 0 임을 검사, 데이터를 구성하는 모든 비트들이 0임을 검사하는 것

 

아래 그림은 8-비트 바이어스된 지수 값들을 나타내는 그림이다.

 

예를 통해 자세히 알아보자

 

바이어스 값이 128일 때, -13.625에 대한 부동 소수점 표현은

 

13.625₁₀ = 1101.101₂ = 0.1101101 * 2⁴

부호(S) 비트 = 1 (-)

지수(E) : 00000100 + 10000000 = 10000100 (바이어스 128 더함)

가수(M) : 10110100000000000000000 (소수점 우측의 첫 1은 제외)

 

부동소수점 수의 표현 범위

 

32-비트 데이터 형식으로 표현 할 때,

  • 부동소수점 수의 표현 범위
    • 0.5 * 2⁻¹²⁸에서 (1 - 2⁻²⁴) * 2¹²⁷ 사이의 양수들
    • -(1 - 2⁻²⁴) * 2¹²⁷에서 -0.5 * 2⁻¹²⁸ 사이의 음수들
  • 제외되는 범위
    • -(1 - 2⁻²⁴) * 2¹²⁷보다 작은 음수 ➡️ 음수 오버플로우
    • -0.5 * 2⁻¹²⁸ 보다 큰 음수 ➡️ 음수 언더 플로우
    • 0
    • 0.5 * 2⁻¹²⁸ 보다 작은 양수 ➡️ 양수 언더플로우
    • (1 - 2⁻²⁴) * 2¹²⁷보다 큰 양수 ➡️ 양수 오버플로우

IEEE 754 표준 부동소수점 수의 형식

부동 소수점 수를 위한 형식과 표현 방법은 컴퓨터 회사 혹은 컴퓨터 기종마다 서로 다르게 정의되고 사용었다. 그에 따른 혼란과 불편을 줄이기 위해 미국전기전자공학회(IEEE)에서 국제 표준인 IEEE 754를 제안했고, 이후 컴퓨터 회사들에 의해 널리 채틱되었다.

 

아래는 IEEE 754 형식의 32 비트 표현, 64 비트 표현을 나타내는 그림이다.

 

 

IEEE 754 표현 예

그런데, 위에서 봤던 정규화와 바이어스와는 조금 다르게

IEEE 754 표준에서는 부동 소수점수를 1.xxxx * 2ⁿ으로 나타내고 32 비트일 때는 바이어스를 127, 64 비트일 때는 바이어스를 1023으로 계산하게 된다.

 

따라서 아래는 -13.625를 IEEE 754 표준에 맞게 32-비트 (단일-정밀도 표준 형식)으로 나타낸 값이다

 

-13.625 = 1.101101 * 2³

 

부호 비트는 음수이기 때문에 1로 세트하고

지수 필드에는 3 + 127 = 130 = 10000010

가수 필드에는 소수점 아래 숫자들을 모두 넣고 남은 칸은 0으로 채운다.

 

 

IEEE 754-2008에서 추가된 정의

2008년도에 IEEE 에서는 4배수-정밀도 (128비트) 표현을 추가로 제안하기도 하였다.

바이어스로는 16383을 사용한다.

 

IEEE 754 정리

 

 

🎯 7. 부동소수점 산술 연산


📌 7 - 1. 덧셈과 뺄셈

덧셈과 뺄셈 알고리즘은 다음과 같은 단계들로 이루어진다

  1. 지수들이 일치되도록 조정 : 소수점 위치 일치
  2. 가수들 간의 연산(더하기 혹은 빼기) 수행
  3. 결과를 정규화

그 예는 다음과 같다.

부동소수점 산술의 파이프라이닝

  • 연산 과정을 독립적 단계들로 분리 가능
  • 단계 수만큼의 속도 향상
  • 대규모의 부동소수점 계산을 처리하는 거의 모든 슈퍼컴퓨터들에서 채택

 

📌 7 - 2. 곱셈과 나눗셈

  • 2진수 부동소수점 곱셈 과정
    1. 가수들을 곱한다
    2. 지수들을 더한다
    3. 결괏값을 정규화
  • 2진수 부동소수점 나눗셈 과정
    1. 가수들을 나눈다
    2. 피제수의 지수에서 제수의 지수를 뺀다
    3. 결과값을 정규화

곱셈의 예는 다음과 같다.

 

부동소수점 연산 과정에서 발생 가능한 문제점

  • 지수 오버플로우
    • 양의 지수값이 최대 지수값을 초과
    • ➡️ 수가 너무 커서 표현될 수 없는 상태이므로, +∞ 또는 -∞로 세트
  • 지수 언더플로우
    • 음의 지수 값이 최대 지수값을 초과
    • ➡️ 수가 너무 작아서 표현될 수 없는 상태이므로, 0으로 세트
  • 가수 언더플로우
    • 가수의 소수점 위치 조정 과정에서 비트들이 가수의 우측 편으로 넘치는 상태
    • ➡️ 반올림 적용
  • 가수 오버플로우
    • 같은 부호를 가진 두 가수들을 덧셈하였을 때 올림수가 발생
    • ➡️ 재조정 과정을 통하여 정규화 즉, 가수를 우측으로 시프트 하고 지수를 증가시킨다.
728x90