P1
복습
-
컴 제약 - 작은수를 더해도 변화가 없음
-
$O(h^n)$ 의 오차크기는 $h^n$에 비례. 왜 첫재항을 따지느냐는 테일러 정리.
-
테일러 급수 변형 $$★ f(x+h)=f(x)+f'(x)h+\frac{f''(x)}{2!}h^2+\frac{f'''(x)}{3!}h^3+...$$
$f(x+h)$의 $x$ 는 애초에 $f(x)$ 의 $x$ 가 아님. 센터의 개념.
P2
- 미분식 종류
-
$f'(x)=\frac{f(x+h)-f(x)}{h}+O(h)$
-
$f'(x)=\frac{f(x+h)-f(x-h)}{2h}+O(h^2)$ - 대신 2번 함수 계산이 들어가야함. $f(x-h)$까지 계산해야 하니까.
-
$f''(x)=\frac{1}{h^2}[f(x+h) - 2f(x) + f(x-h)]+O(h^2)$
-
밑에 나올 부분은 노트 4-1.
숫자 표현을 할 때 컴 제약을 파악하며, 컴퓨터 내부적으로 얼마나 엽기적으로 계산이 돌아가는지 선보이실 예정.
P3
187.1 을 2진수로 바꾸기
-
187을 2진수로 바꾸기
$$187=(a_n a_{n-1} ... a_1 a_0)_2=a_n2^n+...+a_12^1+a_0$$
양변을 2로 나누기를 하면 된다. 세로로 하면 나오는 나머지는 2진수의 역순. 2진수 낮은 자리부터 나오게 된다. 이걸 계산으로 표현하자면
$$93+ \frac{1}{2}=(a^n2^{n-1}+...+a_1)+\frac{a_0}{2}$$
따라서 $a_0=1$ - 이하 반복.
-
0.1을 2진수로 바꾸기
$$(0.1)_{10}=(0.b_1 b_2 b_3 ...)_2=b_1\cdot2^{-1}+b_2\cdot2^{-2}+...$$
양변에 2를 곱하면
$$0.2=0+0.2=b_1+(b_22^{-1}+...)$$
양변 정수부가 같아야하니 $b_1=0$
이런식으로 반복.
P4
하다보면 $b_2=b_3=0$ 이 되고 $b_4=1$이 된다.
이렇게 정수부 맞추다 보면 답은
$$(0.1)_{10}=(0.000110011001...)_2$$
이래서 컴퓨터가 0.1을 정확하게 표현 못한다. 2진수로 끝도 없이 가기 때문에.
컴퓨터가 표현 못하는 수를 찾을라면 이제 알게된 0.1에 2를 곱해나가는 식으로 찾으면 된다. 그 결과에도 곱해나가며 정수부 잘라내고 하다 보면 대부분의 숫자가 안된다는 것을 알수 있다.
이미지 6
P5
고딩때 배웠을 실수는 무한대지만 이런 이유로 컴퓨터에선 유한하다.
25.3을 8진수로 변환하기
2진수처럼 정수부 따로 소수부 따로 한다.
-
정수부
$$(25)_{10} = (a_n ... a_0)_8=a_n8_n+...+a_0$$
$$\frac{25}{8}=3+\frac{1}{8}=(a_n8^{n-1}+...+a_1) + \frac{a_0}{8}$$
따라서 $a_0=1$, 답은 $(3 1)_8$
-
소수부
$$0.3=b_1\cdot3^{-1}+b_2\cdot3^{-2}+...$$
양변에 8을 곱함
$$2.4=2+0.4=b_1+(나머지)$$
따라서 $b_1=2$
만약 여기서 때려치고 변환오차(못바꾼 부분)을 쓰라 할때 당연히 나머지에 지금껏 곱해준만큼 다시 나눠서 답을 써야한다.
그냥 계속 계산하면 $b_2=3$ 이 나오고 0.2가 남는다. 여기서 끝내고 변환오차를 계산하면
$$(0.3)_{10}=(0.23)_2+0.2*8^{-2}$$
이때 뒤쪽이 변환오차가 된다. 더 계산하는거는 노트 6-1 참조.
P6
0.0001234567 십진수로 15자리 반올림시 앞의 0들 버리고 15자리를 하는거고, 1.00000...1 같은 형식이면 앞의 1도 한자리 먹는거로 생각한다. 이경우 소수점 14자리까지고, 오차는 $\frac{1}{2}10^{-14}$보다 작아야겠더라 라는 얘기.
IEEE754 - 32비트 부동소수점 표준
숫자를 지수로 표현.
1234.567 -> $(0.1234567)*10^4$ 같은 느낌. 10진수가 아니고 2진수여야 하지만 대충 이런 개념이다. 2진수중 0을 제외 1이 안들어가는 수는 없기 때문에 그냥 저렇게 땡겨도 된다.
P7
$(0.1)_{10}=(0.000110011001...)_2$ 이걸 예로 들면
$(1.1001100011001...)*2^{-4}$
IEEE754로는 첫번째 1은 저장을 안함. 어차피 땡길거라 0을 제외하면 앞이 1이므로 저장을 안해도 된다. 이걸 Normalized 수라고 부름.
엄청나게 작은 수를 표현하기 위해 앞의 1을 안땡겨내는 경우도 있는데 이걸 denormalized 라고 함.
이미지 7
숫자 영역은 위 이미지와 같다.
무한대는 컴퓨터 영역이 아님. 플러스로 망하던 마이너스로 망하던 상관없이 망한거니 무한대에 음수 붙이네 마네 할것 없음.
이래서 컴퓨터 실수의 숫자는 유한개인 것이다. 32비트로 표현할수 있는건 무조건 제한되니까.
이때 IEEE754 표준은 이렇다.
| 부호(sign) 1bit | 지수부(exponent) 8bit | 가수부(mantissa) 23bit |
|---|---|---|
| 0 | 00000000 | 00000000000000000000000 |
여기서 좀 더 살펴보면 (무한 표시는 무시함)
| 타입 | 지수부 | 가수부 |
|---|---|---|
| 0 | 0 | 0 |
| 디노말라이즈드 | 0 | 0아님 |
| 노말라이즈드 | 1 ~ 2^e - 2 | 아무거나 |
| 무한 | 비트 전부 1(2^e - 1) | 0 |
| 숫자 아님 (NaNs) | 비트 전부 1 | 0 아님 |
이때 부호때문에 지수부는 127을 더하여 저장한다. 디노말라이즈는 시험에 안나온다.
따라서 1.0을 저장한다고 치면 $(1.0)_2 * 2^0$ 의 지수부 0에 127을 더해 지수부에 01111111이 저장된다. 이때 이미 맨앞 1은 표시 안하기로 했으니 가수부 23비트는 다 0이다.
맨앞 1은 표시 안하기로 했으니 가수부는 $2^{-1}$ 부터 $2^{-23}$ 의 값이 된다. 그래서 아래가 컴퓨터에선 성립한다.
$$1+2^{-23}\ne1$$
$$1+2^{-24}=1$$
$$1+2^{-1000}=1$$
그래서 $x=1$에 $h=2^{-24}$ 로 잡으면 미분이 망한다. 선배들 중에는 $x=2$에 $h=2^{-23}$ 은 안망하는줄 알았다 망하는 경우가 있었다고 한다. 아마도 x와 h를 더하는 과정에서 둘의 지수 차이가 -24가 나와 가수부 범위를 벗어나니 망하는거 같다.
P8
지수부가 싹다 1이면 아까 표에서 무한과 숫자 아님에 해당하니 수치해석이 아니다.
이걸 제외하고 지수부 최대는 254에 아까 지수부에 부호를 위해 127이 더해진다고 하였으니 이를 빼야한다. 따라서 지수부 최대값은
$$2^{254-127}=2^{127}$$
이제 가수부 최대값은 싹다 1로 채우면 맨앞 숨겨진 1을 더해
$$1 + (2^{-1} + 2^{-2} +... + 2^{-23})=1+2^0 - 2^{-23}=2-2^{-23}$$
따라서 32비트 컴 최대 숫자는 $2^{127}(2-2^{-23})$
선배들이 질문한것 답변한 내용 정리한 파일 있으니 참고. emach전체모음.pdf 의 첫페이지더라. 여기 내리다 보면 위키피디아에서 긁어온 내용이 나오는데, 이에 따르면 노말라이즈 수중 가장 작은건 $1.18\cdot10^{-38}$까지 된다고 한다.
이는 지수부가 1이 하나고 나머지 다 0이면 나오는 값이다. $2^{-126}1.0\cong1.1810^{-38}$ 이거보다 작으면 디노말라이즈드로 가는데 이건 복잡해서 시험에 안낼것.
P9
시험에 나올법한 예시
-
$x=2$, $h=2^{-23}$, $f(x)=x^2$ 일때 미분하면?
미분식 1빠따 식이 $f'(x)=\frac{f(x+h)-f(x)}{h}$ 이러므로 $x+h$를 구하면
$$x + h = 2 + 2^{-23} = 2(1 + 2^{-24}) = 2$$
즉 망함.
$$★ 1+2^{-23}\ne1$$
을 꼭 기억할것.
계산기 앱실론 ($\epsilon$ mach)
한국 위키피디아 문서를 참조할것.
한국 위키피디아의 정의는 부동소수점 연산에서 반올림하며 생기는 오차의 상한선이다. 교수님은 1에 더해 표시나는 최소의 양수라고 표현했다. 간단히 말하면 그냥 가수부 최솟값이 뭐냐는 거니까 그냥 $2^{-23}$이다.
북한을 정말 좋아하신다. 북쪽에 한 맺힌게 많으신 지도 모르겠다. 정은이 관련 드립은 개인적으로 꽤 괜찮은 드립인거 같은데.
P10
시험에 안나올 디노말라이즈드
-
최대값
지수부는 싹다 0이라고 했었고, 따라서 가수부를 다채우면 디노말라이즈드 최댓값은 $(1.0-2^{-23}) * 2^{-127 + 1}$ 인데, 아까 $(2.0-2^{-23})$ 아니였냐고 한다면 여기는 숨은 1이 없어서 순수 보이는것만 한다.
여기서 -127에 1을 더하는 선배가 싫어할만한 짓을 하는 이유는 구멍 방지용이다. 아까 구한 노말라이즈드 최솟값 지수 -126이랑 -127은 무려 한 지수나 차이나므로 1을 더해 빵구난걸 메워준다.
-
최솟값
걍 부호 뺀 31비트중 맨아래 비트만 1인 경우다. 답은 걍 계산기 앱실론에 지수를 곱하면 되니까 $2^{-23}*2^{-127+1}=2^{-149}$ 이다.
과제
32. IEEE754 단정밀도 부동소수점 표준에서 0일 경우 구멍 크기는?
위에서 구한 디노말라이즈드 최솟값이 표현 가능한 가장 최소이므로 이와 0 사이를 의미하는 것이다.
따라서 답은 $-2^{-149}<구멍<0.0<구멍<2^{-149}$
P11
중간요약
- $1+2^{-23}\ne1$ 이더라. 1에 더해 표시나는 가장 작은 이 수가 계산기 앱실론(앱실론 머신)
- 노말라이즈는 알아놓고 디노말은 시험엔 안나온다. 그래도 알아는 두어야 할거같은데.
- 노말라이즈드에서 가수부에 1이 숨어있다.
아래 과제 작성하다 질문: congruent(합동) 와 similar or equal의 차이? 기호는 왜 비슷한가?
과제 이어서
12. $e\simeq2.7$를 2진법으로 나타내 보아라. (2.718에서 2.7로 변경됨)
문제에 따로 명시되있진 않지만 IEEE754로 나타내 보라는 문제이다.
-
정수부 $(2)_{10}=(10)_2$
-
소수부 $0.7 * 2 = 1 + 0.4$
$0.4 * 2 = 0.8$
$0.8 * 2 = 1 + 0.6$
$0.6 * 2 = 1 + 0.2$$=(0.1011...)_2$
$(2.7)_{10}=(10.1011...)_2$
이를 이제 부동소수점으로 표현하면 $2*(1.01011...)_2$ 가 되어 지수가 1이 나오고, 이에 127을 더한 128이 지수부가 된다.
또 가수부 맨 앞의 1은 표현하지 않으므로, 가수부는 01011...이 된다.
따라서 답은 0 10000000 01011... (32비트까지) 가 된다.
8. $\frac{1}{5}$, $\frac{1}{10}$, $\frac{1}{256}$ 중 IEEE754 표준으로 저장이 가능한 수는?
$(0.1)_{10}=(0.000110011001...)_2$ 임을 이용해 0.1은 IEEE754 표준으로 나타낼수 없다는 것을 알수 있다. 따라서 $\frac{1}{10}$은 저장 할 수 없다.
$\frac{1}{5}$ 은 그 두배이므로 지수부가 차이날 뿐 결국 가수부는 똑같아 같은 이유로 저장 할 수 없다.
$\frac{1}{256}$ 은 $2^{-8}$ 이므로 $1.0\cdot2^{-8}$ 로 쉽게 나타낼 수 있다.
따라서 답은 $\frac{1}{256}$ 이다.
41. x가 실수로 대략 0.6032이고 상대오차가 0.1%라고 할때 x는? (답은 두개가 나온다.)
x를 나타낸 값이 $x^\ast=0.6032$ 일때 상대오차가 0.001이 나오려면 $\vert\frac{x-x^\ast}{x}\vert=0.001$ 이라는 의미다. 양변에 제곱해 근의 공식을 돌리면 답 두개 나온다.
★ 23. $f(x)=\frac{cosx-e^{-x}}{sinx}$ 를 $f(0.008)$ 에서 올바르게 계산하는 방법은? 이때 반올림해 10자리 정밀도로 나타내라.
0에 가까운 작은 수로 계산시 $\frac{0-0}{0}$ 꼴이 되는 오차가 큰 케이스다.
P12
★ 비슷한 수끼리 뺄셈을 하면 유효숫자가 상실된다. 가수부 앞이 0으로 뜨게 되어 영양가 있는 자리수가 날라가게 된다.
이게 무슨 소리냐 하면, 10진수로 대략 소수점 7~8자리만 표현 가능한 부동소수점 수 0.1111155 에서 0.1111133 을 뺀다고 하면 기록되있는 숫자중 남는건 0.0000022로 7자리 정밀도중 2자리밖에 안남게 된다. 이럴 경우 이후 계산이 매우 부정확해지게 된다.
이런 이유로 sinx같은걸 막 계산하면 망하게 된다.
시간초과로 풀이는 이후 이어서 하게 된다.