이건 파이썬이라서 발생한 문제는 아니겠지만 어쨌든 코드를 파이썬으로 하다가 만난 문제다.

지금 만든 프로그램은 f(x)의 평균값을 구해야 한다. 간단하게 x*f(x)를 x에 대해 다 더하고, f(x)를 x에 대해 다 더한 후 둘을 나눠주면 된다.

    for m in range(wbegin,wend):
        for n in range(hbegin, hend):
            x=x+m*array[n][m]
            y=y+n*array[n][m]
            total=total+array[n][m]
    x = x/total
    y = y/total
    return x, y

문제는 x*f(x)를 다 더했더니 overflow가 나 버린다는 것. f(x)중에 음수가 하나도 없고 x도 음수가 하나도 없는데 음수가 나오길래 왜그런가 했더니 x*f(x)를 다 더하다 보니 정수의 한계를 넘어가서 음수부터 다시 시작한 것 같다. (양수를 계속 더했는데 음수가 나오는 경우는 수학적으로는 불가능하니까.)

그래서 이 문제를 해결하기 위해 f(0)부터 시작해서 재귀적으로 계산하여 f(x)까지의 평균을 알 때 f(x+1)까지의 평균을 계산하는 방법으로, 점화식으로 문제를 해결하려고 했다. 이러면 계속해서 나눠주기 때문에 int의 최대값을 넘어가지는 않을 거라고 생각했다. 그러나... 그것은 순진한 생각이었다.
이번엔 f(0)=0에서 시작하는 경우가 문제가 된다. 초항이 0이라 0으로 나누는 오류 발생.
    for m in range(wbegin,wend):
        for n in range(hbegin, hend):
            x=(x*total+m*array[n][m])/(total+array[n][m])
            y=(y*total+n*array[n][m])/(total+array[n][m])
            total=total+array[n][m]
    return x, y

아... 뭐 이래 -_-;

아무튼, 그래서 total = 1로 줬더니 계산은 되는데 오차가 커진다. total = 0.000000000000000001로 주는 무리수를 둬야 하나...

by snowall 2011. 7. 11. 11:22