double 형 sort에 관해서 질문이요

  • 뒹굴
    뒹굴

    STL에서 sort를 사용할려고 하는데요.
    구조체 VERTEX에서 w를 기준으로 내림차순으로 소팅을 하는데
    저는 아래와 같이 했습니다.
    그런데 제대로 소팅이 안되네요. 아마 double형 때문에 그런거 같은데
    제대로 될때도 있고 제대로 안될때도 있어요
    어떻게 하면 좀더 에러를 줄일수 있을까요? Tip좀 알려주세요
    int compare_d(const void* a,const void* b){
    VERTEX* u = (VERTEX*)a;
    VERTEX* v = (VERTEX*)b;
    return (v->w - u->w)>0.00000001;
    }
    저도 굽신굽신..

    [이 글은 과거 홈페이지에서 이전된 글입니다. 원문보기]


    16년 전
3개의 댓글이 있습니다.
  • nocut98
    nocut98

    그냥 return v->w > u->w; 로 하면 안되나요? ==는 몰라도 크기 비교는 잘 해줄꺼 같은데...


    16년 전 link
  • 고글
    고글

    bool compare_d(const VERTEX& a,const VERTEX& b){
    return fabs(a.w - b.w)>0.00000001;
    }
    이러면 될려나.. -_-;
    아직도 논문 데이타 돌리는거에요??


    16년 전 link
  • JongMan
    JongMan
    1. 일단 count 님 말씀대로 v->w > u->w 로 하는 것이 가장 좋다고 생각합니다. ^^ floating point 연산을 그냥 해도 될까 안 될까의 기준은 해당 알고리즘이 실수에 대해 안정적(stable) 한가의 여부인데요. (튜토리얼 쓰겠다고 몇주를 벼르고 있지만 쉽게 시작이 안 되는군요 -.-;) 안정성이라는 개념은 다양하게 정의될 수 있지만 가장 알아듣기 쉬운 설명은 '연산 중 실수 특성에 따른 오차가 났을 때 결과도 많이 바뀌는가' 인 것 같습니다. 소트같은 경우에는, 우리가 실제로 원하는 값이 2진수로 완전히 표현될 수 없어서 사사오입의 오차가 났다고 하더라도 결과가 그렇게 달라지지 않지요. 1.2^10-12 와 1.1^10-12 가 2진수로 똑같이 표현되어서 순서가 바뀌어 나오더라도, 어차피 저만큼 차이나는 두 값의 순서가 어떻게 나오든 현실적으론 별 관계가 없으니까요. 따라서 그냥 소트를 하더라도 안정적이라고 생각하고 맘을 편하게 가질 수 있습니다. :-) 게다가 이런 경우에는, EPSILON 을 적용한 비교를 하더라도 오히려 문제를 악화시킬 뿐이라는 데에서 더욱 문제가 큽니다. -_-;
    2. 고글님이 제시하신 compare_d 는 a 와 b 의 순서를 전혀 신경쓰지 않는군요. ^^;
    3. 꼭 epsilon 이 쓰고 싶으시다면, eps 를 염두에 넣는 == 비교를 따로 넣으시는게 가장 바람직합니다. ~~~ cpp if(fabs(a->w - b->w) < EPS) return false; return a->w < b->w; ~~~
    4. 좀 더 알고싶으시면 튜토리얼을 기다려 주시거나 Numerical Stability 위키피디아 페이지를 참조해 주세요. ^^ 그럼 이만~

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