minkylee

[컴퓨터구조] Floating Point (부동 소수점) 본문

CSE/컴퓨터구조

[컴퓨터구조] Floating Point (부동 소수점)

minkylee 2024. 4. 20. 12:29

Floating Point

 

부동 소수점 또한 이진수로 표현이 된다.

 

그 전에 10진수에 대해 먼저 알아보자

 

일반적으로 100은 $ 10^2 $ 이라고 본다.

 

하지만 scientific notation에서는 이를 $ 1 * 10^2 $ 으로 표현한다. 또한 223을 $ 2.23 * 10^2 $ 라고 표현한다. 이렇게 제일 앞글자만 남기고 뒤를 지수로 표현하는 방법이 scientific notation이라고 하고 이를 normalized 되었다고 한다.

 

이진수도 마찬가지인데 이진수 또한 $ \pm 1. xxxxx_{(2)} * 2^{yyyy} $ 으로 표현한다.

 

수의 맨 앞은 1로 놔두고, 뒤의 x는 fraction, y는 exponent라고 한다.

 

이처럼 point가 not fixed이기 때문에 이를 부동소수점이라고 한다.

Floting Point Standard

  • 각 머신이 서로 다른 규격을 가지고 floating point를 사용할 때 호환이 되지 않았기 때문에 standard 를 정의했다.
  • 32-bit 64-bit 버전이 있다.

IEEE Floating-Point Format

  • 크기 비교를 위해 exponent가 앞에 있다 (exponent가 크면 무조건 크기 때문에)
  • s: sign bit
  • nomalize significand : 1.0 <= |significand| < 2.0 (앞부분의 크기가 이 범위 안에 있도록)
    • 항상 1을 가지고 있기 때문에 표현하지 않는다 (hidden bit)
  • Exponent : excess representation ** 실제 지수 + Bias **
    • Bias 127을 붙이면 지수가 -127 ~ 128 범위 내에서 쓸수 있는데 반해 0 ~ 255 인 양수 범위로 표현 가능하다.
    • 그렇기 때문에 실제 저장된 exponent에는 음수가 없다.
    • 원래 수를 구하려면 다시 127을 빼줘야 한다.
    • integer 실수들의 크기를 비교하기 위해서
    • Single: Bias = 127, Double : Bias = 1023

일반적으로 부동 소수점은 $ (-1)^s * F * 2^E $ 형태로 나타난다.

Special Symbols

bias exponent에서 0과 255는 special symbol로 사용된다.

  • exponent : 0, fraction : 0 -> sign과는 상관없이 0으로 간주
  • exponent : 0, fraction : 0 -> Non zero -> 1.xxxx가 아닌 0.xxxx로 간주
  • exponent : 255, fraction : 0 -> 무한대로 간주
  • exponent : 255, fraction : Nonzero -> NaN (0/0같은 경우)로 간주

따라서 32-bit에서 floating point의 exponent의 가장 작은 숫자는 1로 표현되고 가장 큰 숫자는 254로 표현된다.

Addition

  1. 더해지는 두 수 중 지수가 큰 수에 맞추어, 지수가 작은 수를 변경한다. 이 때 자리이동 이후 버려지는 수가 있을 수 있다.
  2. 유효자리 (fraction)을 서로 더한다.
  3. 이 합은 정규화되지 않았을 수 있으므로, 이를 정규화 시킨다. 이때 오버/언더플로우 여부를 확인하여야 한다.
  4. 비트 수의 표현범위가 넘어가는 경우 근사를 통해 자리수를 맞추어 주고, 또한 다시 정규화가 필요하다면 3, 4의 과정을 반복하여 진행한다.

FP Adder Hardware

  • Step 1 : exponent 비교
    • Exponent difference : 얼마나 차이나는지
    • Control 이 작은 수를 왼쪽으로 보냄
    • Shift right : fraction이 작은 수를 맞춤
  • Step 2 : 더하기
  • Step 3 : Nomalize
  • Step 4 : Rounding

뺄셈도 동일한 방법으로 가능하다

 

부동 소수점 연산은 정수 연산보다 복잡하기 때문에 한 Cycle에 연산이 완수되도록 설계할 것이 아니라, 여러 Cycle에 처리되도록 설계하는 것이 바람직하다.

 

한 Cycle에 처리하도록 설계하면, 다른 연산을 수행하는 시간에도 영향을 미치게 된다.

 

부동 소수점 연산을 수행하는 하드웨어는 One-Clock Cycle 보다는 Pipeline 방식으로 구현된다.

Multiplication

곱셈은 자리 맞춤이 없어도 가능하다. 프로세스만 가지고 보면 덧셈보다 덜 복잡하다.

 

FP Multiplication 플로우차트

  1. exponent를 더한다. (bias가 양쪽에 다 있었기 때문에 두배로 반영이 되어서 하나 빼줘야 한다.)
  2. 정수부를 곱한다.
  3. Nomalize 한다.
  4. Round
  5. Sign 정하기

FP Instruction in RISC-V

  • Single and double precision comparison
    • feq.s, flt.s, fle.s
    • feq.d, flt.d, fle.d
    • 비교의 결과는 integer register인 x5에 저장된다. (0은 false, 1은 true)

Floatinf point를 위한 register는 f0~f31까지 있으며, f0은 0으로 hard-wired register가 아니다.

Accurate Arithmetic, Rounding

연산의 결과가 유효 숫자를 벗어나면, 반올림을 해야한다.


즉, 결과가 fraction 범위를 벗어난다면 반올림을 해야한다.


혹은 1과 2사이에 있는 무한 소수는 표현하지 못하기 때문에 근삿값으로 표현을 하는데, 이 때도 반올림을 해야한다.

 

 

 

guard (유효 숫자의 바로 아래 비트) 와 round (guard 아래 비트)가 덧셈을 할 때 반올림을 위해 사용되는 두 개의 추가 비트이다.

  • 십진수 2.34 + 0.0256을 더한다고 가정하자, 이 때 유효숫자의 범위가 3개라면 계산은 2.34 + 0.02가 되므로 2.36이 된다.
  • 그러나 guard와 round를 사용하면, 2.3400 + 0.0256을 하므로 2.3656이 되고 반올림을 하면 2.37이 된다.

 

 

따라서 IEEE 754에서는 Rounding 기준들을 총 네 개로 분류해 정해놓았다.

  • round toward zero : 반올림 할 때 0으로
  • round toward positive infinity : 반올림 할 때 양의 무한대로
  • round toward negative infinity : 반올림 할 때 음의 무한대로
  • round to Nearest Even (defaul) : 반올림 할 때 가까운 정수로, 하지만 .5일 때는 가까운 짝수로

3.5, -2.5 같은 경우를 halfway case라고 하는데, 또 이것을 해결하기 위해 Sticky를 추가한다.
Sticky는 guard, round 뒤의 모든 bit을 logical OR 연산을 한다.
따라서 Sticky는 남은 모든 bit에서 1이 하나라도 있으면 1, 모두 0이라면 0이 된다.

  • GRS가 000 ~ 011이라면 round down (fraction 그대로 남김)
  • GRS가 101 ~ 111이라면 round up(fraction + 1)
  • 하지만 GRS가 100이라면?
    • LSB가 0이 되도록 round를 조정한다.
    • 1.010100100 -> 1.010100
    • 1.010101100 -> 1.010110

 

FP Example: F to C

float f2c (float fahr) {
	return ((5.0/9.0) * (fhar - 32.0));
}

 

fhar은 f10에, 결과도 f10에 

RISC-V 코드로 구현한 함수

 

 

 

참고

https://heo-seongil.tistory.com/83

[컴퓨터 구조 8장 - FP

실수는 우리가 컴퓨터에서 계산을 위해 많이 사용한다. N bits로 수를 표현하는 방법 – Unsigned integers: 0 to 2^N – 1 (for N=32, 2^N–1 = 4,294,967,295) – Signed Integers (Two’s Complement) -2^(N-1) to 2^(N-1) - 1 (for N

heo-seongil.tistory.com](https://heo-seongil.tistory.com/83)

https://dad-rock.tistory.com/247