NUMB3RS 코드 질문

  • songgj123
    songgj123

    어제 NUMB3RS 문제를 스스로 풀어서 정답이 나왔습니다.

    부족한 점을 보완하려고 책을 봤는데

    이해가지 않는 부분이 있어 질문합니다.

        double NUMB3RS(int v, int day)
        {
            if (day == 0)
            {
                if (v == p)
                {
                    return 1;
                }
                else
                {
                    return 0;
                }
            }
            if (ret != -1)
            {
                return ret;
            }
    
            ret = 0;
    
            for (int before = 0; before < n; before++)
            {
                if (village[v][before] == 1)
                {
                    ret = ret + (NUMB3RS(before, day - 1) / connect[before]);
                }
            }
    
            return ret;
        }
    

    이게 저의 코드이고

    이 코드에서

    if(ret != -1) 을

    if(ret > -0.5) 로 바꾼 것이 책의 코드입니다.

    단순히 cache를 -0.5 보다 작은 값으로 초기화해서 저런 코드를 쓴 건가요??

    이유가 궁금합니다.


    7년 전
3개의 댓글이 있습니다.
  • Corea
    Corea

    float, double 등의 부동 소수점 표현 방식은 구조적인 문제로 오차가 생길 수밖에 없습니다. 자주 하는 실수 모음의 소수 처리 부분을 읽어보시면 도움이 되실 겁니다.


    7년 전 link
  • songgj123
    songgj123

    그러니까 double A 변수에 -1.0을 저장해도 오차로 인해

    A == -1.0 이 false 일 수 있다는 얘기 맞나요??


    7년 전 link
  • Corea
    Corea

    넵. 아마도 -1.0에서는 문제가 생기지 않을 것 같지만, 방어적으로 코딩하기 위해 저러한 습관을 들이는 것은 좋다고 생각합니다.


    7년 전 link
  • 정회원 권한이 있어야 커멘트를 다실 수 있습니다. 정회원이 되시려면 온라인 저지에서 5문제 이상을 푸시고, 가입 후 7일 이상이 지나셔야 합니다. 현재 문제를 푸셨습니다.