programing

C++에서 최소 및 최대 함수 사용

goodcopy 2022. 7. 12. 22:29
반응형

C++에서 최소 및 최대 함수 사용

C++부터std::min그리고.std::max보다 더 좋은.fmin그리고.fmax두 정수를 비교할 때 기본적으로 동일한 기능을 제공합니까?

이러한 기능 세트 중 하나를 사용하는 경향이 있습니까?아니면 효율성, 휴대성, 유연성 등을 향상시키기 위해 직접 작성하는 것을 선호하십니까?

주의:

  1. C++ Standard Template Library(STL; 표준템플릿 라이브러리)는 다음 명령을 선언합니다.min그리고.maxC++ 알고리즘의 표준 헤더에 포함되어 있습니다.

  2. C 표준(C99)은 다음과 같은 기능을 제공합니다.fmin그리고.fmaxC math.h 헤더의 함수입니다.

잘 부탁드립니다!

사이에는 중요한 차이가 있다std::min,std::max그리고.fmin그리고.fmax.

std::min(-0.0,0.0) = -0.0
std::max(-0.0,0.0) = -0.0

반면에.

fmin(-0.0, 0.0) = -0.0
fmax(-0.0, 0.0) =  0.0

그렇게std::min를 1대 1로 대체할 수 없습니다.fmin.기능std::min그리고.std::max가환성이 없습니다.복식으로 같은 결과를 얻으려면fmin그리고.fmax논의를 서로 바꿔서 해야 한다

fmin(-0.0, 0.0) = std::min(-0.0,  0.0)
fmax(-0.0, 0.0) = std::max( 0.0, -0.0)

다만, 이 경우, 이러한 기능은 모두 실장 정의되어 있기 때문에, 실장 방법을 100% 검증할 필요가 있습니다.


또 다른 중요한 차이가 있다.위해서x ! = NaN:

std::max(Nan,x) = NaN
std::max(x,NaN) = x
std::min(Nan,x) = NaN
std::min(x,NaN) = x

반면에.

fmax(Nan,x) = x
fmax(x,NaN) = x
fmin(Nan,x) = x
fmin(x,NaN) = x

fmax다음 코드로 에뮬레이트할 수 있다

double myfmax(double x, double y)
{
   // z > nan for z != nan is required by C the standard
   int xnan = isnan(x), ynan = isnan(y);
   if(xnan || ynan) {
        if(xnan && !ynan) return y;
        if(!xnan && ynan) return x;
        return x;
   }
   // +0 > -0 is preferred by C the standard 
   if(x==0 && y==0) {
       int xs = signbit(x), ys = signbit(y);
       if(xs && !ys) return y;
       if(!xs && ys) return x;
       return x;
   }
   return std::max(x,y);
}

이것은 을 보여준다.std::max의 서브셋입니다.fmax.

이 어셈블리를 보면 Clang이 내장 코드를 사용하고 있는 것을 알 수 있습니다.fmax그리고.fmin반면 GCC는 수학 도서관에서 전화를 걸었습니다.을 위한 집회fmax와 함께-O3

movapd  xmm2, xmm0
cmpunordsd      xmm2, xmm2
movapd  xmm3, xmm2
andpd   xmm3, xmm1
maxsd   xmm1, xmm0
andnpd  xmm2, xmm1
orpd    xmm2, xmm3
movapd  xmm0, xmm2

의 경우std::max(double, double)간단하다

maxsd   xmm0, xmm1

단, GCC 및 Clang의 경우-Ofast fmax심플하게 되다

maxsd   xmm0, xmm1

그래서 다시 한 번 알 수 있다.std::max의 서브셋입니다.fmax그리고 더 느슨한 부동소수점 모델을 사용할 때nan또는 0으로 서명합니다.fmax그리고.std::max똑같아요.같은 주장이 명백하게 적용된다fmin그리고.std::min.

fmin그리고.fmax는 부동소수점 번호("f"를 포함)에 사용하기 위한 것입니다.ints에 사용할 경우 컴파일러/플랫폼에 따라 변환, 함수 호출 오버헤드 등으로 인해 성능 또는 정밀도가 저하될 수 있습니다.

std::min그리고.std::max는 템플릿 함수(헤더에 정의되어 있습니다)입니다.템플릿 함수는 ()보다 작은 모든 타입에서 동작합니다.<연산자). 이러한 비교가 가능한 모든 데이터 유형에서 작동할 수 있습니다.또, 동작하지 않게 하고 싶은 경우는, 독자적인 비교 기능을 제공할 수 있습니다.<.

서로 다른 유형의 인수를 일치하도록 명시적으로 변환해야 하므로 이 방법이 더 안전합니다.예를 들어 컴파일러는 실수로 64비트 int를 64비트 float로 변환하지 않습니다.이 이유만으로 템플릿은 기본 선택이 됩니다.(Matthieu M&bk1e 크레딧)

플로트와 함께 사용해도 템플릿의 성능이 향상될 수 있습니다.소스 코드가 컴파일 유닛의 일부이기 때문에 컴파일러는 항상 템플릿 함수에 대한 호출을 인라인하는 옵션이 있습니다.한편, 라이브러리 기능에 콜을 인라인 할 수 없는 경우가 있습니다(공유 라이브러리, 링크 시간 최적화 부재 등).

fmin과 fmax의 전체 포인트를 놓치고 있습니다.C99에는 최신 CPU가 부동소수점 최소값과 최대값의 네이티브(SSE 읽기) 명령을 사용하여 테스트와 분기(그리고 예측이 빗나간 분기)를 피할 수 있도록 포함되어 있습니다.대신 내부 루프에서 최소값과 최대값 SSE 함수를 사용하기 위해 std:min과 std:max를 사용한 코드를 다시 작성했습니다.또한 속도 향상이 현저했습니다.

SSE 명령을 사용하는 프로세서를 대상으로 한 C++ 구현에서는 fminf, fminlfminl에 해당하는 float, double long double에 대해 std:minstd:max의 전문화를 제공할 수 없습니까?

이 특화에서는 부동소수점 타입의 퍼포먼스가 향상되지만 일반 템플릿에서는 부동소수점 타입을 fminfmax와 같은 부동소수점 타입으로 강제하지 않고 비부동소수점 타입을 처리합니다.

std::min 및 std::max는 템플릿입니다.그래서 그들은 플로트, 복식, 롱 복식 등 덜 연산자를 제공하는 다양한 타입에 사용할 수 있다.범용 C++ 코드를 작성하려면 다음과 같이 합니다.

template<typename T>
T const& max3(T const& a, T const& b, T const& c)
{
   using std::max;
   return max(max(a,b),c); // non-qualified max allows ADL
}

퍼포먼스에 관해서는fmin그리고.fmaxC++와 다릅니다.

64비트 정수 타입을 실장하고 있는 경우는, fmin 또는 fmax 를 사용해 다른(오답) 응답을 얻을 수 있습니다.64비트 정수는 적어도 보통 64비트보다 작은 값을 갖는 2배로 변환됩니다.이러한 숫자를 2배로 변환하면 일부 최하위 비트가 완전히 손실될 수 있습니다.

즉, 실제로는 다른2개의 숫자가 2배로 변환되었을 때 같은 결과가 될 수 있습니다.그 결과, 그 숫자가 잘못되어, 반드시 원래의 어느 입력과 같을 필요는 없습니다.

C++ 를 사용하고 있는 경우는, C++ min/max 의 함수를 사용하는 것이 좋습니다.이것은 타입에 특유하기 때문입니다.fmin/fmax 는 모든 것을 부동소수로/변환하도록 강제합니다.

또, C++ 최소/최대 함수는, 유저 정의 타입에 대해서 연산자< 를 정의하고 있는 한, 유저 정의 타입으로 동작합니다.

HTH

당신이 자신을 언급했듯이fmin그리고.fmax는 C99에서 도입되었습니다.표준 C++ 라이브러리에는 다음이 없습니다.fmin그리고.fmax기능들.C99 표준 라이브러리가 C++에 통합될 때까지(있는 경우) 이러한 기능의 적용 영역은 완전히 분리되어 있습니다.둘 중 하나를 "선호"해야 하는 상황은 없습니다.

그냥 템플리트를 사용하면 됩니다.std::min/std::maxC++로 설정하고 C에서 사용할 수 있는 모든 것을 사용합니다.

Richard Corden이 지적한 대로 표준 이름 공간에 정의된 C++ 함수 min 및 max를 사용합니다.이는 유형 안전성을 제공하며 때때로 바람직하지 않을 수 있는 혼합 유형(플로트 포인트 대 정수)을 비교하는 것을 방지하는 데 도움이 된다.

사용하는 C++ 라이브러리가 min/max도 매크로로서 정의되어 있는 경우는, 경합을 일으킬 가능성이 있습니다.따라서 min/max 함수를 다음과 같이 호출하는 불필요한 매크로 치환을 방지할 수 있습니다(추가 괄호 주의).

(std::min)(x, y)
(std::max)(x, y)

ADL에 의존할 경우 인수 의존형 룩업(ADL, Koenig 룩업이라고도 함)이 무효가 됩니다.

fmin 및 fmax는 부동 소수점 및 이중 변수 전용입니다.

min과 max는 이진 술어가 지정된 모든 유형을 비교할 수 있는 템플릿 함수입니다.복잡한 기능을 제공하기 위해 다른 알고리즘과 함께 사용할 수도 있습니다.

std::min ★★★★★★★★★★★★★★★★★」std::max.

다른 버전이 더 빠를 경우 구현 속도가 더 빠를 수 있으므로 다음과 같은 성능 및 휴대성의 이점을 누릴 수 있습니다.

template <typename T>
T min (T, T) {
  // ... default
}

inline float min (float f1, float f2) {
 return fmin( f1, f2);
}    

그나저나, 인cstdlib__min ★★★★★★★★★★★★★★★★★」__max사용할 수 있습니다.

자세한 것은, http://msdn.microsoft.com/zh-cn/library/btkhtd8d.aspx 를 참조해 주세요.

int에는 항상 min 매크로와 max 매크로를 사용합니다.왜 정수값으로 fmin이나 fmax를 사용하는지 모르겠다.

min과 max의 가장 큰 장점은 외관상으로는 기능이 아니라는 것입니다.다음과 같은 작업을 수행할 경우:

min (10, BigExpensiveFunctionCall())

그 함수 호출은 매크로의 실장에 따라2회 호출될 수 있습니다.따라서 리터럴이나 변수가 아닌 것을 가지고 min이나 max를 호출하지 않는 것이 조직의 베스트 프랙티스입니다.

fmin ★★★★★★★★★★★★★★★★★」fmax의 , , »fminl ★★★★★★★★★★★★★★★★★」fmaxl부호 있는 정수와 부호 없는 정수를 비교할 때 선호될 수 있습니다. 부호 없는 숫자와 부호 없는 숫자의 전체 범위를 이용할 수 있으며 정수 범위와 프로모션에 대해 걱정할 필요가 없습니다.

unsigned int x = 4000000000;
int y = -1;

int z = min(x, y);
z = (int)fmin(x, y);

언급URL : https://stackoverflow.com/questions/1632145/use-of-min-and-max-functions-in-c

반응형