1. 분수 이진수 (Fractionary Buinary Numbers)
- “**Binary Point**” 를 기준으로 오른쪽 비트 = 2의 분수
- rational number를 표현 (유리수)
- 0b 0.1 = 0.5 / 0b 0.01 = 0.25 / 0b 0.001 = 0.125 / 0b 0.0001 = 0.0625 (1/16)
- 2배 ← binary point → 1/2배
- **1.0**에 수렴하는 수
$x / 2^k$ 의 형태인 수만 정확하게 표현이 가능하다. (= 유한한 표현)
- 다른 수는 무한 반복…
2. fixed-Point 표현 (고정 소수점)
- p.q Fixed Point 표현
- 예) 17.14 fixed point representation
- 1 bit = sign bit
- 17 (p) = 정수 (integer)
- 14 (q) = 실수 (fraction)
- 정수 x = x / 2^14
- 최댓값 : (2^31-1) / 2^14 ∺ 131071.999
- <장점 . pros>
- 간편함
- 정수 연산을 사용하여 조작 가능
- floatimg hardware 필요 없음
- 많은 저가형 임베디드 프로세서, DSPs(디지털 시그널 프로세서)들에서 많이 사용됨
- <단점. cons>
- 광범위한 숫자 표현 불가능 (정수부와 소수부의 크기가 크지 않)
- 예) 17.14 fixed point representation
3. 부동 소수점 표현
IEEE standard 754 (754-1985, 754-2008, 754-2019)
- 표준이 정해지기 전엔, 독특한 표현이 많았고 >>이식성문제<< 가 있었음
- 모든 주요 CPU에서 지원
- 주요 설계자인 William Kahan이 튜링 어워드 수상, 1989
- 수치적 문제에 의해 주도됨 (driven bu numerical concerns)
- Nice standard for rounding, overflow, underflow
- rounding(라운딩)이란?
- 연산 후 포맷에 저장하기 전, 추가 비트를 제거하는 법 (반올림)
- rounding(라운딩)이란?
- 빠른 수행은 어려움
- 수치 분석가들이 하드웨어 타입에서의 표준을 정의하는 데 더 우세
- Nice standard for rounding, overflow, underflow
- 표현법
- Single precision (32-bit) : binary 32
- Double precision (64-bit) : bynary 64
- other representations…
- binary16, binary128,…
- Extended format,…
4. FP 표현
- Encoding
- s = sign bit (0=positive, 1=negative)
- M = Mantissa (fractional, 실수) : 가수부
- E = exponent (power of two) : 지수부
- 정밀도 (Precision)
- Single Precision (단일 정밀도) : 8 exp bits (E), 23 frac bits (M) ⇒ total 32 bits (float)
- Double Precision (이중 정밀) : 11 exp bits (E), 52 frac bits (M) ⇒ total 64 bits (double)
1) FP 정규화된 값 (Normalized values)
- exp ≠ 000..0, exp ≠111…1
- Exponent → bias 표현법 사용 //
- E = Exp - bias
- 정렬하기 쉬움
- 2의 보수가 아닌 이유? - 정렬하기 어려움, 지수부만 보고 값 비교하고 싶은데 -가 있어서 비교가 어렵
- Exp = exponent에 의해 표현되는 unsigned value
- Bias = 2^k - 1 (k = exp 비트 수)
- Single precision (E=8) : 2^8-1 = 127 // (-126~127)
- Double precision (E=11) : 2^11-1 = 1023 // (-1022 ~ 1023)
- M = 1.xxxx
- Significand - 정규화하면 첫번째 자리는 항상 1, 따로 저장할 필요 없음. (bianry point 뒤부터 저장)
- 최솟값 : frac(M) = 000…0 (= 1.0)
- 최댓값 : frac(M) = 111…1 (= 2.0 - ?)
2) 비정규화된 값
- exp = 000..0
- (floating point에서는 0에 근접한 값만 표현할 수 있기에 0을 표현하기 위함)
- E = 1 - bias
- M = 0.xxx…x
- Case 1 : exp = 0.000..0, frac = 000…0
- = 0.0 을 의미
- +0, -0 둘 다 존재함을 주의! (MSB 비트로 인해)
- Case 2 : exp = 0.000…0, frac ≠ 000..0
- = 0.0의 근접값
- 점진적인 언더플로우 - 감소하는 정밀도
- 정규화된 최솟값 (Normailized smallest value)
- 1.0000 0000 0000 0000 0000 0000 x 2^-126 = 1.0 x 2^-126
- 비정규화된 최솟값 (Denormalized smallest value)
- 0.0000 0000 0000 0000 0000 0001 x 2^126 = 1.0 x 2^-149
3) 특별한 가치 (Special values)
- exp = 111…1
- 잘 사용 안 함. 굉장히 큰 수
- Case 1 : infinity를 의미
- exp = 111..1, frac = 000…0
- 오버플로우됨
- +/- 둘 다 존재
- e.g., 1.0/ 0.0 = -1.0/ -0.0 = infinity, 1.0/ -0.0 = -infinity
- Case 2 : NaN (Not a Number)
- exp = 111..1, frac ≠ 000…0
- 숫자의 값을 결정할 수 없는 경우 사용, 잘못된 값, 정의되지 않은 값
- e.g., 0.0/ 0.0, sqrt(-1), infinity - infinity , infinity *0.0,…
4) IEEE FP 16 대 구글 Bfloat16
- 2018년에 TPUs를 위해 소개됨 (인텔 NPU 또한 마찬가지)
- FP32와 동일한 유동적인 범위
- 더 작아진 mantissa (가수부)는 전력과 물리적 실리콘 범위를 감소시킴
5) FP Addition (10진수)
6) FP Addition (덧셈)
7) FP 곱셈 (10진수)
8) FP 산술 하드웨어
- FP multiplier (=비슷한 복잡도=) FP adder
- significand (유효 숫자) 연산을 위해서는 adder 대신 multiplier를 사용
- FP 산술 하드웨어의 일반적인 사용
- addition, subtraction, multiplication, division, reciprocol, square-root, …
- FP ↔ 정수 변환
- 한 클럭 사이클 안에 연산을 끝내는 건 너무 오래 걸릴 것임
- integer peration (보다 오래 걸림)
- 느린 클럭은 모든 명령에 불이익을 끼침
- 연산은 주로 여러 클럭을 돔
- 파이프라인 수행
9) C의 부동 소수점
- 두 가지 수준 보장
- float (single precision)
- double (double precision)
- 변환 (conversion)
- double / float → int
- 가수부 자름 (truncates fractional part)
- 0에 가깝도록 rounding (반올림)
- NaN / 범위에서 벗어날 경우, 정의되지 않음 - 일반적으로 TMin으로 설정 (최소값)
- int → double
- 정확한 변환, int가 ≤ 53 bit word 사이즈 내의 범위일 경우에만
- int → double
- 라운딩 모델에 따라 라운드 될
- double / float → int
10) FP 예시
11) 누가 FP 정확도에 관심이 있나요?
- 과학적 코드 (Scientific code)
- 일상 소비자 관점 - 은행 뱅크 잔액 계산..이자… 적은 금액의 처리
- 인텔 FDIV bug
- 정확성 중요
Ariane 5 전략 (June 4, 1996)
- 발사 (liftoff) 후 27초 후에 폭발
- 위성의 가치 $500 million
- Why?
- 수평 속도를 부동소수점으로 계산함
- 16 비트 정수로 변환함
- Ariane 4에서는 16비트가 충분하다고 섬세한 분석을 통해 입증됨
- 10년은 된 소프트웨어 모듈을 재사용함
- Ariane5에서의 오버플로우
- 소프트웨어에 대한 정확한 사양이 없음
5. C의 데이터 유형
- 데이터 타입에 따라 주의해서 사용해야 함
6. 바이트 Odering
multi-byte word 안의 bytes들은 메모리 안에 어떻게 odered 될까?
- Alpha와 PowerPC Mac은 칩의 전력이 켜졌을 때, 바이트 오더링 협약에 따라, 둘 중 어디든 run 가능
- Problem - 서로 다른 머신 간에 네트워크를 통해 바이너리 데이터가 커뮤니케이션 될 때 발생
Big endian
- LSB ———> MSB (least significant byte가 가장 높은 위치에 저장됨)
- sun, PowerPC Mac, Internet
Little endian
- MSB ———> LSB
- Intel x86, ARM running Android & ios, RISC-V
7. Character세트
ASCII (아스키 코드) : 128 characters
- 95 그래픽, 33 컨트롤
Latin -1 : 256 characters
- ASCII + 96 개의 그래픽 캐릭터
Unicode (유니코드) : 32 -bit character set
- 자바, c++, 등…
- 세계 대부분의 알파벳과 기호
- UTF -8, UTF-16 : 가변적인 길이의 인코딩
- unicode transformation format
8. Strings 표현 (문자열)
- String in C
- 문자 배열로 인한 표현
- 각각의 charater들은 아스키코드로 인코딩됨
- 문자 세트의 표준 7비트 인코딩
- 문자 '0'의 코드는 0x30
- 숫자 i 의 코드는 0x30 +i
- 문자열은 null로 끝나야 함, = 0 x 00
- 호환성 (compatibility)
- 바이트 오더링은 문제되지 않음
참고
'전공 테트리스 > 컴퓨터구조' 카테고리의 다른 글
[컴퓨터구조] 4. RISC-V 명령어 1 (0) | 2024.05.18 |
---|---|
[컴퓨터구조] 2. 정수 Integers (1) | 2024.04.27 |
[컴퓨터구조] 1. 컴퓨터 추상화 및 기술 (2) | 2024.04.27 |