Scientific Notation
- 크기가 아주 작거나 아주 큰 수를 나타내는 방법
- 소수점의 위치는 고정되어 있지 않음 Floating Point notation
Normalized scientific notation
- 가수 m의 값을 로 한정
- e.g.
- 전자 : 0.00000000000000000000000000000091093822kg 9.1093822 X
부동소수점 표현
- 부동소수점(浮動小數點, floating-point) 표현은 유효숫자들의 위치를 고려하여 소수점의 위치를 상대적으로 정하는 방법
- 유효숫자: 의미있는 자릿수
- 고정소수점 vs 부동소수점
- 8 개의 숫자를 사용하고 소수점 아래 자릿수가 2개인 십진 고정소수점 표현에서 표현할 수 있는 수의 범위는 0.00 에서 999999.99까지
- 8 개의 숫자를 사용하는 형태의 부동소수점 표현에서 표현할 수 있는 수의 범위는 에서
- 부동소수점 표현이 표현 가능한 수의 범위를 늘린다. (표현 가능한 수의 갯수는 동일)
IEEE 754
- 종류
- 다섯 가지의 이진 부동소수점 기본 형식
- 16(half), 32(single), 64(double), 128(quadruple), 256(octuple) 비트
- 일반적으로 사용됨
- 비트 길이에 따라 m, e 등의 길이가 달라질 뿐 원리는 동일
- 세 가지의 십진 부동소수점 기본 형식
- 32, 64, 128 비트
- 확장 정도 형식(extended precision format)의 기준
- x86 80-비트 확장 정도 표현
- 다섯 가지의 이진 부동소수점 기본 형식
- 이러한 이유로 연산 과정에서 precision을 줄이면 NaN이 나올 수도 있음
라운딩
십진수 라운딩
- 별로 중요한 그림은 아닌듯. 십진수에서는 이런 것들이 있다.
이진수 라운딩
- 이진수의 경우도 십진수와 같은 규칙을 적용할 수 있음
- 가장 가까운 짝수로 라운딩
- 이게 가까운 수 라운딩하되 타이브레이킹을 짝수로 하는 방식
- 이진수에서 짝수란? 마지막 비트가 0인 수 (소수점에서도 마지막 비트만 확인)
- 표준에 내정된 라운딩 규칙
- 예) 소수점 아래 둘째 자리까지 구하는 경우
- 100.00011
- 유효숫자가 소수점 아래 둘째 자리까지 있는 수 중에서 100.00011에 가장 가까운 수는 100.00 하나밖에 없음
- 100.0011
- 100.01
- 100.111
- 가장 가까운 수가 101.00과 100.11로 두 개 존재하므로, LSB가 0인 101.00이 라운딩의 결과가 됨
- 100.101
- 100.10
- 100.11
- 100.10
- 100.00011
0의 표현
두개의 0(+0, -0)이 생긴다.
- 𝐸 = 00 ⋯ 0, 𝐹 = 0.00 ⋯ 0, S = 1 (-0)
- 𝐸 = 00 ⋯ 0, 𝐹 = 0.00 ⋯ 0, S = 0 (+0)
Normalized value
- 𝐸 ≠ 00 ⋯ 0 이고 𝐸 ≠ 11 ⋯ 1 일 때
- , 1 ≤ 𝑚 < 2
- 소수부 의 왼쪽에 암묵적인 1과 그 사이에 소수점이 존재함을 가정
- 위 형태에서 십진수를 구하는 법
- Bias를 구한다. (single: 127)
- E - bias를 구해서 e를 구함
- (0.F) + 1을 통해 m을 구함
- 를 계산
- 거꾸로 십진수에서 m, e, s로 이진수 표현을 구하는 법
- E = e + bias
- mantissa는 앞의 1을 떼고 F로
- Sign bit 붙이기
Bias가 존재하는 이유
지수표현부에 2의 보수 표현을 사용하지 않기 때문에, 음수 지수를 표현할 수 없다. 따라서 bias를 이용한다.
부동소수점 오차
- 손으로 계산해 보기
-
- Mantissa가 너무 길기 때문에 가장 가까운 짝수로 라운딩
- 오차가 발생함
-
Sub-normal value (Denormalized value)
- E = 0000…0 이고 F != 000…0 인 경우
- , 0 < 𝑚 < 1
- 특징
- 소수부 F의 왼쪽에 소수점을 가정하지 않음 (m = F)
- 지수부 E의 값은 무시하고 e = 1-bias (1로 둔다고도 할 수 있음)
- 역할
- 언더플로우를 완충하는 작용
Special Values
Infinity
- 𝐸 = 11 ⋯ 1 이고 𝐹 = 0.00 ⋯ 0 일 경우
- 사칙연산이 무한대를 피연산자로 가지는 경우, 그 연산의 결과값에 대한 규칙이 IEEE 754 표준에 정의되어 있음
- 234.5 ÷ ∞ = 0.0
- −3.14 × ∞ = −∞
- 무한대와 정규 값 또는 서브노멀 값을 서로 비교하는 연산
- +∞ 는 다른 어떤 정규 값 또는 서브노멀 값보다 크고 −∞는 작음
NaN
- 𝐸 = 11 ⋯ 1 이고 𝐹 ≠ 0.00 ⋯ 0 일 경우
- Not a Number
- 계산의 결과값을 정규화된 값, ±0.0, 서브노멀 값 또는 ±∞로 나타낼 수 없는 경우에 사용
- NaN이 결과로 나올 수 있는 연산의 예
- 3.15 + NaN, 0.0/0.0, ±∞/±∞, 0 × ±∞, +∞ + (−∞), −1.0, log(−1.0)
- 무한대와 일반 값과의 연산은 정의되어 있으나 무한대끼리의 연산은 정의되어있지 않으므로 NaN
- 무한대와 달리 NaN은 다른 수와 그 크기를 비교할 수 없음
x86 80 비트 확장 정도 표현
- 바이어스는 16383
- j와 F 사이의 암묵적인 소수점이 가정됨
- 저장되는 메모리의 크기는 96비트나 128비트가 할당됨
- QNaN vs SNaN
부동소수점 연산
- 덧셈, 곱셈의 결합법칙이 성립하지 않음
덧셈과 뺄셈
- 작은 지수를 가진 수의 소수점을 큰 지수를 가진 수의 소수점에 맞춰줌
- 가수를 더함
- 다시 정규화 (라운딩 오차 발생가능)
- 라운딩 오차의 상한과 하한이 나오는데 굳이 볼 필요는 없을 듯…
곱셈
- (진짜) 지수의 합을 구함 (바이어스 고려)
- 가수를 곱함
- 정규화
- 부호 붙이기
- 나눗셈은 지수끼리 빼고, 가수끼리 나누어서 수행
부동소수점 연산을 위한 하드웨어
- 대부분의 컴퓨터가 부동소수점 연산을 빠르게 수행하기 위하여 FPU(Floating-Point Unit)이라 불리는 부동소수점 연산장치를 따로 가지고 있음
- 그 전에는 소프트웨어적으로 정수연산 재활용했다고 함
- 부동소수점 덧셈 및 뺄셈을 수행하는 기본적인 하드웨어는 복잡하게 구성되어 있음
- 지수를 비교하는 하드웨어
- 지수의 차를 구하는 고정소수점ALU
- 가수의 소수점을 맞추는 시프터
- 가수를 더하는 고정소수점 ALU
- 결과를 정규화 하는 하드웨어
- 라운딩을 수행하는 하드웨어
- ±0.0과 ±∞ 같은 특별한 값을 다루는 하드웨어
- 부동소수점 곱셈이나 나눗셈을 수행하는 하드웨어는 덧셈 및 뺄셈을 수행하는 하드웨어보다 상대적으로 간단하다 (신기하다!)
Fused Multiply-Add (FMA)
- 부동소수점 곱셈을 수행한 뒤 바로 덧셈을 수행하는 연산 ()
- FMA를 machine instruction으로 제공하는 경우가 대부분
- 컴파일러 옵션을 이용해 사용할 수 있음
- 유용한 경우
- 내적
- 행렬곱 (중요성에 대한 열변이 있었다)
- 다항식 계산
- 한번의 라운딩만 적용하여 계산 속도와 정확도가 높아진다는 장점이 있다
BFloat16
- Storage 요구사항을 줄이고 ML 알고리즘의 연산 속도를 증가시키기 위함
- Mantissa 영역을 희생하게 되는데, 정확도가 크게 중요하지 않기 때문이다.
- Denormalized value도 지원하지 않음
- 곱셈을 할 때는 BF16을 쓰고, 그 결과를 더할 때는 FP32로 처리하면 정확도를 높일 수 있다
TensorFloat32
- 역시 빠른 연산을 위해 사용한다
- 실제 사용되는 비트수는 19개인데, Alignment 때문에 32bit에 저장된다.
18pg 정도 써가면 좋을ㄷ스