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

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과 그 사이에 소수점이 존재함을 가정

  • 위 형태에서 십진수를 구하는 법
    1. Bias를 구한다. (single: 127)
    2. E - bias를 구해서 e를 구함
    3. (0.F) + 1을 통해 m을 구함
    4. 를 계산
  • 거꾸로 십진수에서 m, e, s로 이진수 표현을 구하는 법
    1. E = e + bias
    2. mantissa는 앞의 1을 떼고 F로
    3. Sign bit 붙이기

Bias가 존재하는 이유

지수표현부에 2의 보수 표현을 사용하지 않기 때문에, 음수 지수를 표현할 수 없다. 따라서 bias를 이용한다.

부동소수점 오차

  • 손으로 계산해 보기
      • Mantissa가 너무 길기 때문에 가장 가까운 짝수로 라운딩
      • 오차가 발생함

Sub-normal value (Denormalized value)

  • E = 0000…0 이고 F != 000…0 인 경우
  • , 0 < 𝑚 < 1
  • 특징
    1. 소수부 F의 왼쪽에 소수점을 가정하지 않음 (m = F)
    2. 지수부 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

부동소수점 연산

  • 덧셈, 곱셈결합법칙이 성립하지 않음

덧셈과 뺄셈

  1. 작은 지수를 가진 수의 소수점을 큰 지수를 가진 수의 소수점에 맞춰줌
  2. 가수를 더함
  3. 다시 정규화 (라운딩 오차 발생가능)
  • 라운딩 오차의 상한과 하한이 나오는데 굳이 볼 필요는 없을 듯…

곱셈

  1. (진짜) 지수의 합을 구함 (바이어스 고려)
  2. 가수를 곱함
  3. 정규화
  4. 부호 붙이기
  • 나눗셈은 지수끼리 빼고, 가수끼리 나누어서 수행

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

  • 대부분의 컴퓨터가 부동소수점 연산을 빠르게 수행하기 위하여 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 정도 써가면 좋을ㄷ스