컴퓨터아키텍처

Computer Architecture

2016-04-07


부동 소수점 연산 Floating Point Arithmetic
(덧셈, 곱셈)

과제 제출 안내

  • Google Drive 공유 폴더를 통해 (종이 X, 메일 X)
  • [새로 만들기] 버튼을 눌러
    CA16<이름><학번> 폴더를 만들고 (예: CA16김연아123456)
    만들어진 폴더를 우클릭하여 나오는 드롭메뉴에서
    폴더 공유설정으로 kyagrd@gmail.com 에게 공유 (편집권한)
  • Google 메일 계정만 있으면 Google Drive 서비스 이용 가능 
  • Google 메일 계정은 무료로 만들 수 있으며
    참고로 안드로이드 스마트폰 사용자는 누구나 이미 보유

MIPS 어셈블리 실습

  • SPIM 시뮬레이터 사용
  • MIPS 어셈블리 syntax coloring 지원하는텍스트 에디터
    • Sublime Text
    • Notepad++
    • Vim
    • Emacs

IEEE 754에서 Rounding 등

  • Rounding 모드

    • Round Up: +∞에 가까운 방향으로

    • Rownd Down: -∞에 가까운 방향으로

    • Towards Zero: 양수는 Down 음수는 Up

    • Round to Even: 가장 가까운 짝수로

  • Special Values (+∞, -∞, 0, NaN 등)

    • e가 00..00, 혹은 11...11. 십육진수로는 00, FF 

    • e=00, f=0 일 때 0 (s에 따라 +0과 -0 두개 존재)

    • e=00, f!=0 일 때 맨 앞에 0이 붙어있다고 가정하고 즉 normalized 되지 않은 수들도 표현하게 해 줌

    • e=FF, f=0 일 때 s에 따라서 +∞, -∞

    • e=FF, f!=0 이면 NaN (Not a Number. 0.0/0.0의 결과)

Overflow, Underflow

  • Overflow - 허용 범위보다 큰 절대값 (즉 e=FF로 넘어감)
    처리결과: 양수인 경우는 +∞, 음수인 경우는 -∞

  • Underflow - 가장 작은 normalized 절대값보다 작은 값
    처리결과: denormalized (e=00, f!=0)

    • denormalized 수의 절대값을 (즉 f를) 점점 줄이면
      자연스럽게 0이 된다 (e=00, f=0)

Special Value 관련 연산

  • 1.0 + (1.0/0.0) = 1.0 + ∞ = 

  • 1.0 + (0.0/0.0) = 1.0 + NaN = NaN
  • ∞ + ∞ = ∞,  -∞ + -∞ = -∞,  +∞ + -∞ = NaN
  • 1.0 / ∞ = 0.0,  1.0 x ∞ = ∞,  0.0 x ∞ = NaN
  • ∞ / 1.0 = ∞,  ∞ / 0.0 = ∞,   ∞ / ∞ = NaN
  • +∞는 NaN과 +∞외 모든 부동소수점 수보다 크다
  • -∞는 NaN과 -∞외 모든 부동소수점 수보다 작다
  • 모든 부동소수점수 x에 대해 (x = NaN,  +∞, -∞ 포함)
    • NaN < x, NaN > x, NaN = x 는 항상 거짓
    • NaN != x 는 항상 참

1 byte 부동 소수점 수

  • 32bit만 되어도 손으로 종이에 쓰고 읽기가 머리아프므로
    메릴랜드 대학 CS학과 강의노트에서 나오는 짧은 길이의 IEEE 754와 비슷한 부동 소수점 수 형식 예제로 설명

  • 8비트로 구성 S : 1, E : 4, F : 3

  • 1 1001 001   -1.001 x 2^(1001-0111) = -100.1 (십진수 -4.5)

  • 1 1001 000   -1.000 x 2^(1001-0111) = -100.0 (십진수 -4.0)

F. P. 덧셈

  • e1 < e2 일 때 e1을 e2에 맞추고 그만큼 1.f1을 shift right

  • 예를 들어 f1=101, e1=0110, f2=101, e2=1000 이라면

X = 1.f_1 \times 2^{(e_1 - 0111)}
X=1.f1×2(e10111)X = 1.f_1 \times 2^{(e_1 - 0111)}
Y = 1.f_2 \times 2^{(e_2 - 0111)}
Y=1.f2×2(e20111)Y = 1.f_2 \times 2^{(e_2 - 0111)}
X = 1.101 \times 2^{(0110 - 0111)}
X=1.101×2(01100111)X = 1.101 \times 2^{(0110 - 0111)}
= 0.011 \times 2^{(1000 - 0111)}
=0.011×2(10000111)= 0.011 \times 2^{(1000 - 0111)}
Y = 1.101 \times 2^{(1000 - 0111)}
Y=1.101×2(10000111)Y = 1.101 \times 2^{(1000 - 0111)}
10.000 \times 2^{(1000 - 0111)}
10.000×2(10000111)10.000 \times 2^{(1000 - 0111)}
+
++
= 1.000 \times 2^{(1001 - 0111)}
=1.000×2(10010111)= 1.000 \times 2^{(1001 - 0111)}
  • 계산결과를 이렇게 다시 normalize 해줘야 할 경우도 있다

  • 마지​막으로 e를 보고 overflow/underflow 검사 등 처리

끝의 01
잘려나감

F. P. 곱셈

  • 1.f1 x 1.f2 를 하고 exponent끼리는 덧셈 (bias임에 유의)

  • 예를 들어 f1=101, e1=0110, f2=001, e2=1000 이라면

X = 1.f_1 \times 2^{(e_1 - 0111)}
X=1.f1×2(e10111)X = 1.f_1 \times 2^{(e_1 - 0111)}
Y = 1.f_2 \times 2^{(e_2 - 0111)}
Y=1.f2×2(e20111)Y = 1.f_2 \times 2^{(e_2 - 0111)}
X = 1.101 \times 2^{(0110 - 0111)}
X=1.101×2(01100111)X = 1.101 \times 2^{(0110 - 0111)}
Y = 1.001 \times 2^{(1000 - 0111)}
Y=1.001×2(10000111)Y = 1.001 \times 2^{(1000 - 0111)}
1.110101 \times 2^{(0111 - 0111)}
1.110101×2(01110111)1.110101 \times 2^{(0111 - 0111)}
\times
×\times
= 1.110 \times 2^{(0111 - 0111)}
=1.110×2(01110111)= 1.110 \times 2^{(0111 - 0111)}
  • 앞의 덧셈 예처럼 normalize 해줘야 할 경우도 있다

  • 마지​막으로 e를 보고 overflow/underflow 검사 등 처리

뺄셈과 따로 필요없다

  • s를 뒤집어서 더하면 뺄셈

컴퓨터아키텍처

By 안기영 (Ahn, Ki Yung)

컴퓨터아키텍처

2016-04-07

  • 1,597