2013-04-06 1 views
-1

세 개의 숫자가 있다고 가정합니다. 그 중 두 가지는 그들 사이의 범위를 형성합니다. 마지막 숫자, 그 범위 내에 있는지 확인하고 싶습니다. 범위의 시작과 끝을 정의하는 숫자는 다른 것보다 크거나 작을 수 있습니다. 이것은 성능 향상을 위해 노력하고있는 물리 알고리즘을위한 것이므로 조건문을 사용하지 않는 것이 좋습니다.숫자가 다른 두 숫자 사이에 떨어지는 지 확인하는 가장 간결한 방법은 무엇입니까?

double inRange(double point, double rangeStart, double rangeEnd){ 
    // returns true if the 'point' lies within the range 
    // the 'range' is every number between 'rangeStart' and 'rangeEnd' 
    // rangeStart can be greater than or less than rangeEnd 
    // conditional branches should be avoided 


    return ?; // return values [0.0 - 1.0] are considered 'in range' 
} 

조건 논리를 사용하지 않고이를 수행 할 수식이 있습니까?

편집 :

가 대신 부울의 두 배를 반환 나도 비율을 알 필요가 있기 때문입니다 이유; 0.0은 한 가장자리에 가장 가깝고 1.0은 다른 가장자리에 가장 가깝습니다.

내가 가진 원래의 알고리즘

은 이것이다 :

double inRange(double point, double rangeStart, double rangeEnd){ 
    if(rangeStart > rangeEnd){ 
     double temp = rangeStart; 
     rangeStart = rangeEnd; 
     rangeEnd = temp; 
    } 
    return (point - rangeStart)/(rangeEnd - rangeStart); 
} 

내 프로파일 러는 프로그램이 실행되는 시간의 약 16 %가 활성화 최적화로,이 기능에 소요 보여줍니다. 그것은 꽤 자주 불린다. 조건문이 전적으로 책임이 있는지는 잘 모르겠지만 하나도 가지고 있지 않은 함수를 시험해보고 싶습니다.

+3

왜 '이중'을 반환합니까? – Barry

+3

조건문을 쓰면 속도가 느려지는 이유는 무엇입니까? –

+0

배리 - 범위 내의 비율도 알아야합니다. 0.0은 rangeStart에 가장 가깝고 1.0은 rangeEnd에 가장 가깝습니다. –

답변

3

당신의 사양은 조건문을 싶지 않아 "는 말에 가까운 시작에 가까운 제로 1을 반환해야합니다", 그 시작과 끝이 교환 될 수 대답 :

return (point-std::min(rangeStart, rangeEnd))/std::abs(rangeStart - rangeEnd); 

특정 STL 구현에 대해 잘 모르겠지만 min에는 반드시 조건부 구현이 필요하지 않습니다. 예를 들어, min (a, b) = (a + b-abs (b-a))/2.

+0

방금 ​​편집을 보았습니다. 코드가이 코드와 매우 비슷합니다. – WhitAngl

+0

최소, 최대 호출 수를 줄임으로써 결과를 단순화했습니다. 분모에서 호출 할 필요는 없습니다. –

+0

예, 실제로! 감사! – WhitAngl

2

시작이 끝보다 큰 경우이를 바꾸십시오.

관련 문제