2013-03-15 12 views
6

C++의 경우 타입이 T이고 정수 또는 부동 소수점 유형이 있다고 가정 해 봅시다. y < x에 대해 T 유형의 가장 큰 숫자 y을 찾고 싶습니다. 정수와 부동 소수점 숫자 모두를 투명하게 처리하려면 솔루션을 템플릿으로 만들어야합니다. x이 이미 T에 표시 될 수있는 가장 작은 숫자 인 경우를 무시할 수 있습니다.가장 큰 번호 <x?

사용 가능 사례 :이 질문은 현지화 된 것으로 표시되어 더 일반적이라고 생각되는 사용 사례를 제공하고자합니다. 저는 OP의 원작자가 아닙니다.

struct lower_bound { 
    lower_bound(double value, bool open) : value(open? value+0.1 : value) {} 
    double value; 
    bool operator()(double x) { return x >= value; } 
}; 

이 클래스는 개방 또는 폐쇄 될 수있는 하나 하한 시뮬레이션 :

이러한 구조를 고려한다. 물론, 실제 (말장난 의도) 삶에서 우리는 이것을 할 수 없습니다. S을 계산하는 것은 불가능합니다 (또는 최소한 까다 롭습니다). S 부동 소수점 숫자의 집합입니다 때 우리는 기본적으로 셀 수있는 집합으로 취급되기 때문에

enter image description here

그러나, 이것은 매우 유효한 원칙이다; 그런 다음 열린 경계 또는 닫힌 경계와 같은 것이 없습니다. 즉,> =는 lower_bound 클래스에서 수행되는 것과 같이 정의 될 수 있습니다.

코드 단순화를 위해 +0.1을 사용하여 열린 하한을 시뮬레이션했습니다. 물론, 부동 소수점 표현에서 값 < z < = value + 0.1 또는 값 + 0.1 == 값과 같은 값 z가있을 수 있으므로 0.1은 원가 값입니다.

struct lower_bound { 
    lower_bound(double value, bool open) : open(open), value(value) {} 
    bool open; 
    double value; 
    bool operator()(double x) { return (open ? x > value : x>=value); } 

}; 

그러나,이 sizeof의 (LOWER_BOUND가), 큰 및 연산자로 덜 효율적이다() 필요 : 따라서 @ 브렛 - 헤일 대답은 매우 유용합니다 :)

당신은 또 다른 간단한 해결책에 대해 생각할 수 있습니다

입니다 보다 복잡한 문장을 실행합니다. 첫 번째 구현은 실제로 효율적이며 구조가 아닌 이중으로 구현 될 수도 있습니다. 기술적으로, 두 번째 구현을 사용하는 유일한 이유는 이중이 연속적이라고 가정하기 때문입니다. 그렇지 않은 경우에는 예측 가능한 미래에 아무 것도 없을 것입니다.

유효한 사용 사례를 만들고 설명하고 원래 작성자에게 불쾌감을주지 않았기를 바랍니다.

+1

는이 지점 유형을 부동 일 것입니다 무슨의 예를 들어 주실 수 있습니까? 그것은'y'의 가수가 1 비트 작고 지수가 같음을 의미합니까? – angelatlarge

+3

나는 27.5k 사용자로부터 더 많은 것을 기대한다. –

+0

너 .. 뭐하려고 했니? – Rapptz

답변

11

당신이 C++ (11), 당신은 <cmath>std::nextafter를 사용할 수있는 경우 :

if (std::is_integral<T>::value) 
    return (x - 1); 
else 
    return std::nextafter(x, - std::numeric_limits<T>::infinity()); 
+0

[x-1.0은 부동 유형의 경우 x와 같을 수 있으며 많은 수의> _ 33554432에서 발생합니다 (http : //coliru.stacked-crooked.com/view? id = cc0ae3f34df4c559275ba1290458f077-61c3814520a8d4318f681038dc4b4da7) –

+0

@MooingDuck - 네, 고맙습니다. ute 오류. –

+0

@BrettHale : 쉽게 관리 할 수 ​​있습니다. 내 코드도 다 끝났을 것입니다. –