본문 바로가기
IT_Study/CS_Study

[Parallel Computing] (5) Floating Point Representations

by 두번째얼룩 2024. 4. 16.

이번 글에서는 Floating Point을 나타내는 방법에 대해서 알아보겠다. 

 

과학적 표기법(Scientific Notatation)은 크기가 아주 작거나 아주 큰 수를 나타내는 방법이다. 이를 표현하기 위하여 아래와 같이 표기 할 수 있다.

과학적 표기법

1) a 는 실수로서 가수(mantissa) 혹은 계수로(coefficient)라 표현한다. 

2) b 는 양의 정수로서 기수(base)라 표현한다.

3) n 은 정수로서 지수(Exponent)라 표현한다.

소수점의 위치가 고정되어 있지 않으므로 같은 숫자라도 서로 다르게 표현가능하다.

예를 들어 아래와 같이 서로 다른 a,b,n으로 표현 가능하다.

0.245 = 0.245 * 10^0 = 2.45 * 10^1 = 24.5 * 10^2 

정규화된 과학적 표기법(Normalized Scientific notation)은 하나의 수를 한 가지 방법으로 나타내도록 한정하는 것이다. 위의 예제를 보면 빨색으로 표기된 가수(Mantisa)/계수(coefficient)에 따라 지수(Exponent) 값이 변경된다. 이 가수/계수 값을 1<= a <= b로 한정하면 한가지  방식으로만 표현이 된다. 위의 예제로 살펴보면 a는 1보다 크고 10보다 작아야하므로 

0.245 = 2.45 * 10^1 

으로 표현되어야 한다. 

 

 앞서 가수/기수/지수를 통해서 숫자를 표현하는 방법을 알아보았다. 해당 3가지에 얼마나 많은 비트를 할당해서 표현하느냐에 따라 숫자를 표현할 수 있는 정도가 결정된다. 부동소수점(Floating-point) 표현은 유효숫자들의 위치를 고려하여 소수점의 위치를 상대적으로 정하는 방법이다.

예를 들어, 8개의 숫자를 사용하는 데, 소수점 아래 자릿수가 2개이고, 기수가 10인 고정소수점 표현에서 표현할 수 있는 수의 범위는 0.00 ~ 999999.99 까지 가능하다. 소수점 자리 수 2개 이므로 xx.00 ~ xx.99 까지 가능하고 소수점을 표현하기 위하여 2개의 숫자를 사용했으므로 정수부분에 6개의 숫자를 사용할 수 있다. 

 다른 방식으로 똑같이 8개의 숫자를 사용하는데, 위의 과학적 표기법을 이용하여, m0.m1m2m3m4m5 * 10^(e1e2)으로 표현한다고 가정하자. 이 경우 표현할 수 있는 수의 범위는 0.00000 * 10^00 ~ 9.99999 * 10^99 까지 가능하다. 

위의 두 가지 방식으로 표현할 수 있는 숫자의 범위는 서로 다르지만 동일하게 8개의 숫자만을 사용하고 있기 때문에, 표현하는 정보의 양은 같다. 

 

부동소수점 표현이 다양하게 이뤄질 수 있기 때문에, 다른 부동소수점 표현을 사용하는 컴퓨터 시스템 간에는 서로 호환이되지 않는다. 이런 점을 방지하고자 1985년 IEEE에서 부동소수점 표현 및 연산에 대한 표준을 정의하였다.(IEEE 754)

현재는 거의 모든 제조사가 이 IEEE 754-2008(2008년도에 개정) 표준을 따르고 있다. 

부동 소수점 표현의 종류는 아래와 같다.

1. 이진 부동소수점 기본 형식

- 16(half), 32(single), 64(double), 128(quarduple), 256(octuple) bit

2. 십진 부동소수점 기본 형식

- 32, 64, 128 bit

3. 확장 정도 형식(extended precision format)의 기준

- x86 80-bit 확장 정도 표현

 

아래 그림은 32-bit IEEE 754 이진 부동소수점 표현을 나타내고 있다. 부호,지수(Exponent) 그리고 가수(Mantissa)에 할당하는 bit의 수가 결정되어 있다. 

base(2) 32-bit floating point [1]

아래 테이블은 32-bit floating point에서 표현할 수 있는 값을 나타내고 있다. 지수와 가수의 값에 따라 0/무한대/NAN 값까지도 표현 가능하다. 

32-bit floating point table[2]

 

모든 실수를 위와 같은 부동 소수점 표현으로 정확하게 나타낼 수 없다. 그 수에 가장 가까우면서도 부동소수점 표현으로 나타낼 수 있는 값으로 어림잡는다. 이를 Rounding이라 표현하고, Rounding으로 인한 오차(원래 값과 Rounding 한 값의 차이)를 Rounding Error 혹은 Rounding-off Error라고 부른다.

 Rounding 하는 방법에는 여러 가지가 존재한다. 아래 예시를 보면 5가지 방법이 있다.

1) 가장 가까운 쪽으로 하되 비기면 짝수로 라운딩

2) 가장 가까운 쪽으로 하되 비기면 0에서 먼수로 라운딩

3) 0으로 향하도록 라운딩

4/5) +- Inifite로 향하도록 라운딩.

Rounding Example [3]

이진수도 십진수와 같은 규칙을 적용할 수 있다. 아래 예시를 소수점 아래 둘째 자리까지 가장 가까운 짝수로 라운딩을 수행하면 아래와 같다. 

1) 100.0011

100.00 < 100.0011 < 100.01 

100.00 와 100.0011의 거리 :: 0.0011

100.01 와 100.0011의 거리 :: 0.0089

100.01이 더 가까우므로 100.01

2) 100.111

100.11 < 100.111 < 101.00

100.11 와 100.111의 거리 :: 0.001

101.00 와 100.111의 거리 :: 0.001

서로 두 거리가 같으므로 짝수인 수를 선택해야 한다. LSB가 0인 101.00이 라운딩의 결과가 된다. 

 

정규값(Normalized Value)

아래 수식과 같이 정규값을 표현 할 수 있다. Sign bit으로 +- 부호를 결정하고, 가수(Mantissa)으로 f를 설정하고, 지수(Exponent)로 E를 설정한다. 여기에서 주목해야 하는 점은 지수로 E를 설정할 때, E = 지수(Exponent) - bias 값으로 계산한다. bias를 도입하는 이유 중 하나는 음의 지수를 표현하기 위함이다. 그리고 또 살펴봐야하는 점은 아래 수식에 1.에 해당하는 부분이다. 32-bit 표현에는 없지만 암묵적으로 1과 가수(Mantissa) 사이에는 소수점이 존재한다고 가정한다.

Normalized Value

서브 노말 값(Subnormal Value)

아래 수식과 같이 서브 노말 값을 표현 할 수 있다. Sign bit으로 +- 부호를 결정하고, 가수(Mantissa)으로 f를 설정하고, 1-bias 값으로 Emin를 설정한다. 가장 작은 지수 표현으로 가장 작은 값들을 표현하고자 한다. 그래서 지수 E는 나타낼 수 있는 가장 작은 값을 취하고, 정규값에서는 암묵적으로 1이 존재한다고 가정했지만, 여기서는 더 작은 수인 0으로 가정하였다. 

Subnormal Value

오버플로우/언더플로우

오버플로우는 값의 크기가 너무 커서 정규 값으로 나타낼 수 없을 경우 오버플로우가 발생하고 값은 +Infinite or -Infinite로 표현된다. 

언더플오우는 값의 크기가 너무 작아서 나타낼 수 없을 때를 말하고, 서브 노멀 값을 통해서 최대한 표현하고자 하지만 그러지 못할 경우 0.0으로 어림잡는다. 

 

무한대

사칙연산이 무한대를 피연사자로 가지는 경우, 그 연산의 결과값에 대한 규칙이 IEEE 754 표준에 정의되어 있음.

무한대와 정규값 또는 서브 노멀 값을 서로 비교하는 연산을 때는 +Infinite는 다른 어떤 정규 값 또는 서브노말 값보다 크고 -Infinite는 작다.

 

NAN(Not a Number)

계산의 결과값을 정규화된 값, +-0.0, 서브 노말 값, +-Infinite로 나타낼 수 없는 경우에 사용되고, 다른 수와의 크기 비교를 수행할 수 없다. 

 

x86 80-bit extention format

부동소수점 표현을 80-bit 까지 확장해서 사용한 방법으로 Intel의 80x87계열의 부동소수점 코프로세서를 위해 처음 제안되었고, 그 이후 x86 아키텍처의 부동소수점 연산장치에서 계속 사용되었다. 

 일반적으로 데이터는 메모리 접근 효율성을 높이기 위해서 Alignment 요구를 만족해야 하며, 시스템에 따라 보통128-bit이나 96-bit로 할당된다.

80-bit extention format[4]

부동소수점 연산

부동소수점에서의 연산은 수행 순서에 따라 그 결과가 달라 질 수 있기 때문에, IEEE 754에서 덧셈과 곱셈 같은 산술 연산의 결과를 결정하는 간단한 규칙을 제공한다. 

부동 소수점 덧셈과 곱셈 연산은 계산하는 순서를 바꾸는 결합 법칙이 성립하지 않는다. 

부동소수점 뺄셈 x-y는 덧셈 x+(-y)로 변환하여 처리한다.

덧셈을 수행하는 순서는 다음과 같다.

1. 두 수의 지수를 동일 값으로 맞춘다. 

2. 두 수의 가수를 더한다.

3. 가수를 더한 결과를 표기법에 의한 자리수를 넘어서면 Rounding을 수행한다.

 

곱셈을 수행하는 순서는 다음과 같다.

1. 가수끼리 곱한다,

2. 지수끼리 더한다.

3. 정규화가 필요할 경우 Rounding을 수행한다. 

 

부동소수점 연산을 위한 하드웨어

대부분의 컴퓨타가 부동소수점 연산을 빠르게 수행하기 위하여 FPU(Floating-Point Unit)이라 불리는 부동소수점 연산장치를 따로 가지고 있다. 덧셈과 뺄셈을 수행할 때 필요한 기본적인 하드웨어는 아래와 같다.

1. 지수를 비교하는 헤드웨어

2. 지수의 차를 구하는 고정소수점 ALU

3. 가수의 소수점을 맞추는 시프터

4. 가수를 더하는 고정소수점 ALU

5. 결과를 정규화 하는 하드웨어

6. 라운딩을 수행하는 하드웨어

7. +- 0/Infinite를 다루는 하드웨어

오히려 부동소수점 곱셈이나 나눗셈을 수행하는 하드웨어는 덧셈 및 뺄셈을 수행하는 하드웨어보다 상대적으로 간단하다.

 

부동소주점 연산 조합 중에 특별히 많이 쓰이는 것을 따로 한번에 계산할 수 있도록 만들어두기도 한다. Fused Multiply-Add는 부동소수점 곱셈을 수행하고 바로 다음에 부동소수점 덧셈을 수행하는 연산으로 x*y+x 형태의 계산을 한번에 수행하는 연산이다. 이를 지원하는 프로세스는 FMA 연산을 위한 머신 인스트럭션을 제공하고, 이 인스트럭션을 이용하는 코드를 생성하려면 컴파일러 옵션을 이용해야 한다. FMA 연산은 내적이나 행렬을 곱하는 연산, 다항식 계산에 유용하다. FMA 연산을 이용하여 계산 속도와 정확도를 높일 수 있다. 정확도는 한번의 라운딩만 적용하므로 연산을 나눠서 수행했을 때보다 더 높은 정확도를 가진다.

 

 

 

 

 

 

 

 

 

 

 

[1] : https://www.ques10.com/p/64757/represent-125025-into-single-precision-format-1/

 

Represent 125.025 into single precision format

written 2.2 years ago by binitamayekar ★ 6.3k •   modified 22 months ago Single-Precision IEEE 754 Floating-Point Standard Single-Precision IEEE 754 Floating-Point Standard look as follows: $0^{th}$ bit represent Sign bit. (1 bit) $1^{th}$ to $8^{th}$

www.ques10.com

[2] : https://mycareerwise.com/index.php/content/ieee-754-single-precision/content/exam/gate/computer-science 

 

IEEE – 754 Single-Precision

IEEE – 754 Single-Precision

mycareerwise.com

[3] : https://angularindepth.com/posts/1017/how-to-round-binary-numbers

 

Angular in Depth

 

angularindepth.com

[4] : https://en.wikipedia.org/wiki/Extended_precision

댓글