https://gall.dcinside.com/mgallery/board/view/?id=math&no=34742&page=1


일반론을 말씀드리면.. 컴퓨터에서 C 등으로 수치 계산을 하다보면 실수를 표현해야 할 때 대개 fixed-point 혹은 floating-point 데이터 타입을 쓰게 되는데요. fixed-point는 한마디로 aa.bbb 식으로 정해진 비트수로 정수부와 소수부를 표현을 합니다. 10진수+양수를 예로 들면, 위에서 나타낼 수 있는 가장 작은 수는 00.000 (= 0)이고, 가장 큰 수는 99.999 이며, precision은 0.001 입니다. 장점은 표현할 수 있는 범위내+주어진 precision내에서는 정확하게 해당 실수를 표현할 수 있습니다. 단점은, 표현할 수 있는 범위가 작습니다. floating-point는 소숫점의 위치를 유동적으로 변화시킬 수 있습니다. 위의 경우, 더 작은 precision이 필요하면 소숫점을 하나 옆으로 옮겨 a.bbbb식으로 표현할 수 있고, 더 큰 수를 표현할 필요가 있으면 소숫점을 우측으로 옮겨 aaaa.b 처럼 표현할 수 있구요. 장점은 표현할 수 있는 범위가 더 넓고, 필요에 따라 왔다갔다 할 수 있어요 (작은 수 + 높은 precision 혹은 큰 수 + 낮은 precision). 다양한 이유로 많은 사람들이 대개 실수를 표현하기 위해 floating-point를 쓰는데, 이것의 가장 큰 단점은.. 큰 수에 작은 수를 더하면 그 작은 수가 사라져요. 위의 경우, 현재 값이 9999.1인데, 여기에 0.01을 더하면 그냥 값이 9999.1로 변하지를 않습니다. 따라서, 현재 값 9999.1에 아무리 0.01을 수천번 더해도 값은 계속 9999.1이에요. 말씀하신 책에서 numerical subtractive cancellation issue나 비슷한 용어들은 대개 이 문제를 의미합니다. 문제에서, 테일러 전개를 쓰는데 아시다시피 h가 작을수록 근사값이 참값에 더 가까워지잖아요. 그런데, 이것을 수치적으로 구하려고 하면, h가 너무 크면 근사값 에러가 너무 크고, h가 너무 작으면.. 위의 문제가 생깁니다. 예를 들어, s(n) = a(1) + ... + a(n) 이라고 하고, s(무한대)를 구하고 싶다고 할때요. 물론 a(무한대)는 = 0이 될 것이므로, 어느정도 항까지만 구하면 될텐데요. s(k)까지 구한다음에, s(k+1)을 구할려면 s(k) + a(k+1)을 계산하는데, 이게 s(k)와 같은 값이 나올수가 있거든요. 이렇게 구하면 s(k+2), 혹은 일반적으로 s(k+p)를 구해도 이게 s(k)와 같아질 수가 있습니다. 그러면, "아니 그 얘기는 결국 우리가 표현할 수 있는 범위 내에서 더 이상 어떻게 할 수 없으니까 이게 수치적으로 우리가 구할 수 있는 최선의 값 아닌가?" 라고 할 수 있는데, 이게 또 그렇지가 않거든요. 예를 들어, s(k)까지 구하고.. 그 이후에 다른 floating-point 변수에 따로 a(k+1)+a(k+2)+...+a(k+p) 까지 구한후에 이 값을 s(k)에 더하면 이것도 s(k+p)인데, 이게 s(k)와 다를 수가 있겠죠. 위의 a(k+1)+...+a(k+p)가 현재 s(k)를 표현하는 범위의 precision안에 들어오면 되니까요. 사실 precision이 그렇게 큰 문제가 아니라면 그냥 전자처럼 구해도 되는데요.. precision이 중요하다면 후자처럼 구해야 합니다. (다른 방법도 있구요). 어쨌든, 주어진 캡쳐본에서 얘기하고 있는 것은 저런 문제입니다.