Integers for floating point arithmetics

Tags:

Bresenham’s line algorithm에서 파생된 것이라고 합니다. 이 라인그리기 알고리즘은 두 점을 알고 slope를 알때 x값이 주어지면 y값을 결정하는 방법에 대한 것입니다. x값이 1씩 증가함에따라 라인그리기 알고리즘은 매번 y를 0 또는 1 증가하게 되죠. 이때, y를 식에 넣어 결정하는 대신에 이전 x에 대한 y값과, slope로 인해 계산되는 y값간의 오차를 계산합니다. 다음, 이 오차가 0.5를 넘는지 여부에 따라서 y를 그대로 두거나 1증가하는 방식입니다.

정수에서의 나눗셈 처리은 그에 대한 파생 알고리즘의 설명입니다. 예를들어 26/7을 7회 더한다고 할때 이 계산을 integer로 처리하면 매번 3만 더할 것이고, 따라서 7회 더해도 7*3=21 만 증가하게 되는 오류가 발생합니다. 이를 해결하기 위해 sum과 remainder를 다음과 같이 놓습니다.

// 초기화
sum = 0;
remainder = 0;

// 26 / 7을 더하기
for (int i = 0; i < 7; ++i) { sum += (26 + remainder) / 7; remainder += (26 + remainder) % 7; } [/code] 이렇게 해서 계산을 하는 예를들어보죠. 제일 처음 26/7을 하면 26/7 = 3 + (5/7) 이므로 sum=3, remainder=5입니다. 한번 더 26/7을 더하면 (26/7) + (26/7) = (3 + 5/7) + (3 + 5/7) = (6 + 1) + (3/7) = 7 + (3/7) 입니다. 그러므로 sum = 7, remainder = 3. 따라서 위의 코드는 매번 sum을 계산할때 26/7 외에 남아있는 나머지(제일 처음에는 5/7, 두번째에는 3/7)을 더해줍니다. 또, remainder는 나머지 값을 추적하는데 최초에는 26/7 을 하고난 나머지인 5, 두번째에는 분수 부분만 더하면 10/7이지만 이것이 1을 초과하므로 남는 나머지 3/7만 기억하게 됩니다.