수의 체계

정수

다 알다시피 2n2n비트 숫자는 2n-2^n 부터 2n12^n - 1 까지 표현가능

실수

x=±1.m×2cx = \pm 1.m \times 2^c

단정도 (single)에선 sign 1비트, exponent 8비트, mantissa 23비트
배정도는 (double)에선 sign 1비트, exponent 11비트, mantissa에 52비트

단정도에서 c=e127c = e - 127

특이하게 exponent가 all 0면 x=±0.m×2cx = \pm 0.m \times 2^c로 계산하고, (c는 e=1일 때의 값)
exponent가 all 1이면 m이 0이면 무한대, 아닐 경우 NaN

머신입실론 (Machine epsilon)

발생할 수 있는 상대오차의 최대치.
mantissa 비트가 1만 변했을 때의 오차다.

즉, 단정도에서 ε=223\varepsilon = 2^{-23}, 배정도에서 ε=252\varepsilon = 2^{-52}

중요) 부동소수점 방식은 상대오차가 일정함!! 절대오차는 달라짐 (작은 실수는 절대오차가 작고, 큰 실수는 절대오차가 큼)

오차

마무리오차 (round-off error)

컴퓨터에 수를 반올림해서 저장하느라 발생하는 오차.

특히 덧셈 등 두 수의 연산을 수행할 때 발생하는 마무리오차는 확산 마무리오차라고 하며, 대부분의 경우 ε\varepsilon이랑 같다.
하지만 크기가 비슷한 두 수를 빼거나 크기가 너무 다른 두 수를 더할 때는 ε\varepsilon보다 커진다.

c.f. 유효수상실
서로 비슷한 두 수를 빼면 유효숫자가 줄어듦
e.g. a가 1.23456789고 b가 1.23456788이라면 a, b는 유효숫자가 9자리지만 aba-b는 유효숫자가 1자리임

해결방안 1) 뺄 때는 식을 변형시켜서 덧셈을 사용
e.g. 1+x1=x1+x+1\sqrt{1+x} - 1 = \frac{x}{\sqrt{1+x}+1}

해결방안 2) 더할 때는 grouping(N개씩 묶어서 더함) 또는 작은 수 부터 더함
e.g. i=1N1i4\sum_{i=1}^N \frac{1}{i^4}i=1i=1 부터 더하는 것보다 i=Ni=N 부터 더하는게 훨씬 정확함

절단오차

문제의 해석에서 발생하는 오차.
대표적으로 테일러전개는 당연히 무한개의 항을 전부 더할 수 없는데, 만약 아래 식처럼 3번째 항에서 끊었다면 뒤따르는 나머지 항들이 오차가 됨.

f(x+h)f(x)+hf(x)+h22!f(x)f(x+h) \approx f(x) + hf'(x) + \frac{h^2}{2!}f''(x)

일반적으로 절단오차가 작아지면 마무리오차가 커지기 때문에, 오차가 제일 줄어드는 적당한 선에서 계산해야함.