2016-04-06
부동 소수점 수 Floating Point Number
Sign, Exponent, Fraction (Mantissa)
Single precision (32bit -- s: 1, e: 8, f: 23)
Double precision (64bit -- s: 1, e: 11, f: 52)
기타 extended precision 포맷들도 있다
s(sign bit)가 0이면 양수 1이면 음수
f는 맨 앞에 1이 붙어있다고 가정하고 2진수 소수점 부분만
예) s=1, f=0101...0101 이면 -1.0101...0101 x 2^e 를 나타냄
f는 2의 보수가 아닌 signed magnitude 방식
e가 나타내는 값은 (e의 unsinged 값) - 011...11
즉 기본적으로 unsinged 표기이되 중간정도 값을 0으로
(그래서 bias 라고도 부름)
32bit만 되어도 손으로 종이에 쓰고 읽기가 머리아프므로
메릴랜드 대학 CS학과 강의노트에서 나오는 짧은 길이의 IEEE 754와 비슷한 부동 소수점 수 형식 예제로 설명
8비트로 구성 S: 1, E: 4, F: 3
11001001 -1.001 x 2^(1001-0111) = -100.1 (십진수 -4.5)
11001000 -1.000 x 2^(1001-0111) = -100.0 (십진수 -4.0)
그런데 반대로 4.25를 1byte 부동소수점수로 나타내려면?
이진수로 100.01 = 1.0001 x 2^(1001-0111)
fraction의 길이가 3으로 제한되어 있어 0001 표현 불가
버림으로 000 아니면 올림으로 001? 이것이 Rounding
부동소수점 수는 넓은 범위 수 표현 장점
32bit 정수(fixed point 2의 보수)는 -2^31 ~ 2^31-1
single precision 부동소수점수는 대략 -2^128 ~ 2^128
문제는 fraction(mantissa) 길이의 정확도로만 표현가능
십진수 표현 소수점 수를 옮길 때 오차 발생 가능
정수의 경우도 많은 자리수 정수를 변환하면 오차 발생
이런 오차가 제대로 관리되지 않아서 실제 큰 사고도 발생.
대표적으로 1991 걸프전 미국의 패트리어트 미사일 오작동 이라크 스커드 미사일 격추에 실패로 28명의 미국인 사망.
매 0.10초 카운터 변수++해서 시간=카운터*0.10 으로 코딩.
시스템 가동 100시간 후에는 0.34초 오차 누적, 격추 위치 계산은 무려 500m발생 (SIAM News, 25(4):11, July 1992)
출처: http://howardhuang.us/teaching/cs232/10-MIPS-floating-point-arithmetic.pdf
Rounding 모드
Round Up: +무한대에 가까운 방향으로
Rownd Down: -무한대에 가까운 방향으로
Towards Zero: 양수는 Down 음수는 Up
Round to Even: 가장 가까운 짝수로
Special Values (+무한대, -무한대, 0, NaN 등)
e가 00..00, 혹은 11...11. 십육진수로는 00, FF
e=00, f=0 일 때 0 (s에 따라 +0과 -0 두개 존재)
e=00, f!=0 일 때 맨 앞에 0이 붙어있다고 가정하고 즉 normalized 되지 않은 수들도 표현하게 해 줌
e=FF, f=0 일 때 s에 따라서 +무한대, - 무한대
e=FF, f!=0 이면 NaN (Not a Number. 0.0/0.0의 결과)