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이 중요하다면 후자처럼 구해야 합니다. (다른 방법도 있구요). 어쨌든, 주어진 캡쳐본에서 얘기하고 있는 것은 저런 문제입니다.
헉.... 정말 감사드립니다. 이런 고급 지식을 이렇게 친절하게 설명해주시다니.... 이런 기회 정말 흔치 않은데 제가 귀인을 만났네요ㅠㅠ 다시 한 번 정말 감사드립니다...!