티스토리 뷰

현상

  • raspberry pi에서는 잘 동작하던 코드인데, notebook 환경에서는 정상적인 값이 출력되지 않았다.

예제 샘플코드

    # 문제의 코드
    # 매번 같은 결과값이 나옴
    def create_time_key1():
        max_value = sys.maxsize
        now_seconds = time.time()
        return int(max_value-now_seconds)
    # 수정 후
    # 결과값이 잘 나옴
    def create_time_key2():
        max_value = sys.maxsize
        now_seconds = int(time.time())
        return max_value-now_seconds

원인

  • 부동소수점 연산 오류로 인해 발생한 이슈로 보인다. 라즈베리파이에서는 문제가 발견 안되었던게, python에서 int연산이 32bit로 연산이 되고, notebook에서는 64bit로 연산이 된다. 64bit max size라는 매우 큰 값에서 연산을 하니, (부동 소수점 연산에서 발생하는) 오차가 생기는 현상이 발생하며, 이를 int로 변형하는 과정에서 같은 값이 나온 것으로 보인다.

느낀점

  • 부동소수점 연산 오차를 고려할 정도로 작업을 한 적이 없어서, 크게 신경안쓰고 코딩을 했는데, 처음으로 문제를 만났다. 모르던 지식도 아닌데, 괜히 특정 조건 때에 python에서 변수 할당이 잘못되나 싶어서 메모리를 뜯어보려면 어떻게하나 하며 삽질을 했다. 라즈베리 파이에서 잘 동작하는 코드라 신경쓰지 않고 있었는데, 이렇게 문제를 만나니 꽤 재미난 경험이었다. 하하.