메모
소프트웨어 장인
어디로 가고 있는지 모르고 있다면, 결국 가고 싶지 않은 곳으로 간다.
-요기 베라
어디로 가야 할지 모른다면
커리어 방향은 한 번 결정하고 나서 내달리기만 하면 되는 것이 아니다.
지속적으로 재평가하고 목표를 다시 세워야 한다.
어디로 가고 싶은지 확신할 수 없을 때에는, 스스로를 기회가 나타날 수 있는 상황에 두어야 한다.
세상이 나에게 접근할 수 있어야 한다.
기회를 만들어 낼 몇 가지 활동들:
- 새로운 것을 공부하고 기술적 지식을 확장한다.
- 커뮤니티나 행사에 정기적으로 참여한다.
- 다른 사람과 교류한다.
- 지금 하고 있는 것, 새롭게 배운 것들을 블로깅한다.
- 오픈 소스 프로젝트에 참여한다.
- 프로젝트를 만들고 공유한다.
- 컨퍼런스에 참여한다.
오늘 배운 것들
1. CSAPP 2장
헷갈리는 부동소수점만 정리
1-1. 비율 이진수
이진수를 b=∑i=−nm2i×bi로 표기한 것.
책에서 이진소수 중 소수부가 모두 1인 수를 약식으로 1−ɛ (ɛ=2n, n은 음의 정수)로 표기한다.
그러나 컴퓨터에서 비율 이진수로 소수를 저장하고 표현하려면 자리수에 비례한 메모리 공간이 필요해진다.
1-2. IEEE 부동소수점 표시
유효숫자 표시와 유사하다.
V=(−1)s×M×2E
(s=0,1 , 0≤M<1 또는 1≤M<2, E는 정수)
단일정밀도 부동소수점은 총 32비트(4바이트)로 구성되며 부호 1비트, 지수 8비트, 가수 23비트
이중정밀도 부동소수점은 총 64비트(8바이트)로 구성되며 부호 1비트, 지수 11비트, 가수 52비트
편의를 위해 단일정밀도 부동소수점을 기준으로 설명
1-2-1. 부호 표시
부호는 s가 0이면 양수, 1이면 음수.
1-2-2. 지수 표시
부호와 지수를 합쳐서 부호있는 정수형처럼 2의 보수로 표현할 것 같지만 아니다.
9비트 정수형에서 −1은 111111111, 0은 000000000으로 표현되지만
IEEE 부동소수점의 지수에서는 2k−1−1(k는 지수 비트수. 이 숫자를 Bias라고 한다.)를 0으로 삼아 선형적으로 표현된다.
E=e−Bias(e는 지수표시)
단일정밀도에서 Bias=127이고 00000001은 −126을, 01111111은 0을, 11111110은 127을 가리킨다.
00000000과 11111111은 각각 −126과 무한대(가수가 0인 경우)를 나타낸다.
00000000이 −127이 아니라 00000001과 같이 −126을 가리키는 이유는 가수부가 2−(k−1)미만인 수(특히 0)를 표현할 때 사용하기 위함으로 아래에서 서술한다.
11111111이 128이 아닌 무한대를 가리키는 이유는 매우 큰 수를 2129−ɛ으로 근사할 수 밖에 없는 경우를 피하기 위해서일 듯 하다.
1-2-3. 가수 표시
- 지수가 00000001−11111110인 경우(정규화 값)
가수를 1.∗∗∗∗∗∗∗∗가 되도록(1≤M<2) 표시한다.
다만 비트에는 소수부만 표시한다.
가수가 1.00010111인 경우 00010111만 저장한다.(암시적 선두 1표시, hidden bit)
이런 구성은 가수표현에 1비트를 절약하여 정밀도를 높인다.
하지만 1미만의 가수를 표시할 수 없다.
따라서 지수가 00000000일 때에 다른 표시법을 사용한다.
- 지수가 00000000인 경우(비정규화 값)
가수를 0.∗∗∗∗∗∗∗∗가 되도록(0≤M<1) 표시한다.
비트에는 소수부만 표시한다.
0을 표시할 수 있으나 이 경우 표현할 수 있는 최댓값은 지수가 1−ɛ(부동소수점에서 ɛ=2−23)인 경우이므로 지수를 −127로 해석하는 경우 표현할 수 없는 부분이 생긴다.
따라서 00000000지수도 −126으로 해석하는 것이다.
- 지수가 11111111인 경우(특수 값)
가수가 0인 경우 무한대를 가리킨다.(부호는 s에 따라 달라진다)
가수가 0이 아닌 경우 잘못 표현된 숫자(NaN)을 가리킨다.
1-2-4. 예시
- 정규화 값
1 01111110 00000100000000000000000
=(−1)1×2011111102−011111112×1.0000012
=(−1)1×2126−127×6465
=(−1)1×2−1×6465
=(−1)1×12865=−0.5078125
- 비정규화 값
0 00000000 10000000000000000000000
=(−1)0×2−126×0.12
=(−1)0×2−126×21
=(−1)0×2−127
=5.8774718e−39
- 특수 값
1 11111111 00000000000000000000000
=−∞
1 11111111 11100000000000000000000
=NaN
1-2-5. 근사법(rounding 반올림)
소수를 근사하려는 자리수 아래가 10000...의 형태인 경우 어느 쪽 숫자로 근사할 것인지가 문제가 된다.
10진법에서 xx.xxxx50000인 경우의 문제와 동일하다.
IEEE에서는 네 가지 근사 모드를 정의한다.
- 짝수근사법(round-to-even) 기본
짝수와 가까운 곳으로 근사하는 방법.
3.5는 4로, 4.5도 4로 근사한다.
1001.12은 10102으로, 1010.12도 10102로 근사한다.
수가 많은 경우 통계적 편향을 방지하기 위해 사용한다.
- 영방향 근사(round toward-zero)
0과 가까운 곳으로 근사한다.
- 하향근사(round-down)
작은 쪽으로 근사한다.
- 상향근사(round-up)
큰 쪽으로 근사한다.
양수에서 반올림하려는 자리수만으로 처리할 수 있다는 특징을 갖는다.
일상에서 자주 사용하는 방식
1-2-6. 부동소수점 연산
책에서는 연산과정을 자세히 소개하기보다는 부동소수점 연산에 적용되지 않는 수학적 특성들만을 설명하고 있다.
기본적으로 부동소수점은 근사치로 저장되기 때문에 연산 또한 근사한 결과만 보장할 수 있는 정도의 정밀도만 갖도록 만들어졌다.
1-2-6-1. 부동소수점 덧셈(+f)
-
교환법칙이 성립한다.
x+fy=y+fx
-
결합법칙은 성립하지 않는다.
(x+fy)+fz=x+f(y+fz)인 x,y,z가 존재한다.
예: (3.14+f1e10)−f1e10=1e10−f1e10=0
round(1e10) = 0 10100000 00101010000001011111001(233×1.001010100000010111110012)
round(3.14) = 0 10000000 10010001111010111000011(21×1.100100011110101110000112)
3.14의 지수부를 33로 두게 되면
round(3.14) = 233×0.000000000000000000000002 = 0
이 되므로 3.14+f1e10=1e10이 된다.
반면, 3.14+f(1e10−f1e10)=3.14+f0=3.14이므로
(3.14+f1e10)−f1e10=3.14+f(1e10−f1e10)
-
연산에 대한 단조성을 갖는다.
a≤b이면 x+fa≤x+fb가 항상 성립한다. 즉, a<b이지만 x+fa=x+fb인 경우는 존재할 수 있다.
1-2-6-2. 부동소수점 곱셈(×f)
- 교환법칙이 성립한다.
- 항등원(1.0)을 갖는다.
- 결합법칙은 성립하지 않는다.
예:
(1e20×1e20)×1e−20=∞×1e−20=∞
1e20×(1e20×1e−20)=1e20×1=1e20
- 덧셈에 대한 분배법칙이 성립하지 않는다.
a×(b+c)=a×b+a×c인 a,b,c가 존재한다.
예:
1e20×(1e20−1e20)=1e20×0=0
1e20×1e20−1e20×1e20=∞−∞=NaN
- 연산에 대한 단조성을 갖는다.