CS/3-1 컴구

[컴퓨터구조] #9. Multiplication / Floating Point

이지이즤 2022. 4. 7. 15:49

 

Lec 9. Multiplication / Floating Point (Arithmetic for Computers)

 

- Multiplication
  : Multiplicand 피승수 (n-bit) * Multiplier 승수 (m-bit) = Product 결과 (최대 n+m bit)

    1) 승수가 1이면 피승수(=피승수*1)을 적절한 공간에 복사한다.
    2) 승수가 0이면 0(=피승수*0)을 적절한 공간에 놓는다.

- Multiply in MIPS
  : 32bit * 32bit -> up to 64bit

  mult $r, $s
  : multiply $r and $s, and put the result to HI ans LO
   (HI and LO : 특별 레지스터)

  mfhi $d (move from hi register)
  : move the multiplication result in the HI register to $d

  mflo $d (move from lo register)
  : move the multiplication result in the LO register to $d

- Multiplication

  : iteration이 0일때, 승수와 피승수 4bit를 초기화, 나머지는 0으로 초기화.
    실질적인 피승수 값은 4bit에 들어있지만 Multiplicand는 Product와 같은 크기인 8bit를 확보해줌.
   
    승수의 bit수 만큼 아래의 두 단계 iteration을 반복함.
    ->승수가 1이면 Product에 Multiplicand를 더하고 0이면 아무것도 안함.
    ->그 후, Multiplicand를 Shift left(위치 맞추기), Multiflier를 Shift right(가장 오른쪽 자리의 수만 들여다봄) 해줌.

 

 

 


 

 

- Floating Point
  Normalized
  : 10진수에서는 절댓값 기준 1<=x<10 이어야 정규화 되었다고 함,
    2진수에서는 절댓값 기준 1<=x<2 이어야 정규화 되었다고 함.

- Floating Point Standard
  : IEEE std 754를 기준으로 부동소수점 표현함.
    표현법 두가지
   -> Single precision (32-bit) : 수업에선 이것만 다룸.
   -> Double precision (64-bit) : 더 정밀함.

  S : sign bit (1이면 negative, 0이면 non-negative)
  Normalize significand : 1.0 <= |significand| < 2.0
                                 무조건 1.xx 이므로 1.은 표현할 필요 없음. 그래서 Fraction에 소숫점 뒷자리만 나타냄.
  Exponent : actual exponent + Bias (무조건 unsigned 취급)
                 single precision 에서는 Bias = 127


- Single-Precision Range
  : Exponents 00000000 and 11111111 reserved (예약되어있음)
  
  Smallest value (절댓값 기준)
  -> Exponent : 00000001
      actual exponent = 1 - 127 = -126 (이거보다 작으면 underflow)
  -> Fraction : 000..00
      significand = 1.0
  => +- 1.0 * 2^-126 ≈ +- 1.2 * 10^-38

  Largest value (절댓값 기준)
  -> Exponent : 11111110
      actual exponent = 254 - 127 = +127 (이거보다 크면 overflow)
  -> Fraction : 111..11
      significand  2.0
  => +- 2.0 * 2^+127 ≈ +- 3.4 * 10^+38

 

ex1) represent -0.75 (10진수)
      -0.75 = -1.5 * 2^-1 = -3 * 2^-2 = -11 (2진수) * 2^-2
              = (-1)^1 * 1.1 * 2^-1
      -> S = 1
      -> Fraction = 1000..0
      -> Exponent = -1 + 127 = 126 = 01111110
      => 1 01111110 1000...00

ex2) what number is repesented 1 10000001 01000...00
      -> S = 1
      -> Fraction = 01000...00
      -> Exponent = 10000001 = 129
      x = (-1)^1 * 1.01 * 2^(129-127)
           이때, 1.01 = 1*2^0 + 0*2^-1 + 1*2^-2 = 1.25 이므로
        = (-1) * 1.25 * 2^2
        = -5.0

 

 


 

 

- Floating-Point Addition
  1) Align binary points
  2) Add significands
  3) Normalize result & check for over/underflow
  4) Round(반올림) and renormalize if necessary(반올림했는데 첫번째 수 건드린 경우)

ex) 4-digit binary example
    : 1.000 * 2^-1 + -1.110 * 2^-2 (0.5+ -0.4375)
    1) 1.000 * 2^-1 + -0.111 * 2^-1
    2) 1.000 * 2^-1 + -0.111 * 2^-1 = 0.001 * 2^-1
    3) 1.000 * 2^-4, with no over/underflow
    4) 1.000 * 2^-4 (no change) = 0.0625

 

 


 

 

- FP Adder Hardware
  : Floating Point 덧셈은 Integer 덧셈보다 느림,
   근데 one clock cycle 에 실수 덧셈 수행하려면 너무 느려짐. 정수 덧셈까지 느려짐. 다른 명령어 전체적으로 느려짐.
   (가장 느린 명령어 기준으로 clock 주파수가 낮춰지기 때문)
   따라서 실수 산술연산시 파이프라인 사용해서 여러 사이클에 걸쳐 계산하는 것이 좋음.