std::numeric_limits 사용 주의사항

7108 단어 C/C++
주금 찬
원본:http://blog.csdn.net/clever101
       C/C++11 에서 std::numericlimits 는 템 플 릿 류 로 라 이브 러 리 컴 파일 플랫폼 에서 기본 산술 형식의 극치 등 속성 정 보 를 제공 하고 전통 적 인 C 언어 가 사용 하 는 예비 처리 상수(구체 적 인 참고:C+상용 수치 유형의 값 범위 의 매크로 정의)를 대체 합 니 다.그 중에서 사용 예 는 다음 과 같다.
#include   
#include 

/* reference: 
    http://www.cplusplus.com/reference/limits/numeric_limits/ 
    https://msdn.microsoft.com/en-us/library/c707ct0t.aspx 
*/  
int test_numeric_limits_1()  
{  
    std::cout << std::boolalpha;  
    std::cout << "Minimum value for int: " << std::numeric_limits::min() << std::endl;  
    std::cout << "Maximum value for int: " << std::numeric_limits::max() << std::endl;  
    std::cout << "int is signed: " << std::numeric_limits::is_signed << std::endl;  
    std::cout << "Non-sign bits in int: " << std::numeric_limits::digits << std::endl;  
    std::cout << "int has infinity: " << std::numeric_limits::has_infinity << std::endl;  
  
    std::cout << "Minimum value for float: " << std::numeric_limits::min() << std::endl; // min returns the smallest positive value the type can encode, not the lowest  
    std::cout << "Lowest value for float: " << std::numeric_limits::lowest() << std::endl; // the lowest value  
    std::cout << "Maximum value for float: " << std::numeric_limits::max() << std::endl;  
    std::cout << "float is signed: " << std::numeric_limits::is_signed << std::endl;  
    std::cout << "Non-sign bits in float: " << std::numeric_limits::digits << std::endl;  
    std::cout << "float has infinity: " << std::numeric_limits::has_infinity << std::endl;  
  
    std::cout << "Minimum value for unsigned short: " << std::numeric_limits::min() << std::endl;  
    std::cout << "Maximum value for unsigned short: " << std::numeric_limits::max() << std::endl;  
  
    std::cout << "is_specialized(float): " << std::numeric_limits::is_specialized << std::endl;  
    std::cout << "is_integer(float): " << std::numeric_limits::is_integer << std::endl;  
    std::cout << "is_exact(float): " << std::numeric_limits::is_exact << std::endl;  
    std::cout << "is_bounded(float): " << std::numeric_limits::is_bounded << std::endl;  
    std::cout << "is_modulo(float): " << std::numeric_limits::is_modulo << std::endl;  
    std::cout << "is_iec559(float): " << std::numeric_limits::is_iec559 << std::endl;  
    std::cout << "digits10(float): " << std::numeric_limits::digits10 << std::endl;  
    std::cout << "radix(float): " << std::numeric_limits::radix << std::endl;  
    std::cout << "min_exponent(float): " << std::numeric_limits::min_exponent << std::endl;  
    std::cout << "max_exponent(float): " << std::numeric_limits::max_exponent << std::endl;  
    std::cout << "min_exponent10(float): " << std::numeric_limits::min_exponent10 << std::endl;  
    std::cout << "max_exponent10(float): " << std::numeric_limits::max_exponent10 << std::endl;  
    std::cout << "epsilon(float): " << std::numeric_limits::epsilon() << std::endl;  
    std::cout << "round_style(float): " << std::numeric_limits::round_style << std::endl;  
  
    std::cout << "The smallest nonzero denormalized value for float: "  
        << std::numeric_limits::denorm_min()<< std::endl;  
    std::cout << "The difference between 1 and the smallest value greater than 1 for float: "  
        << std::numeric_limits::epsilon()<< std::endl;  
    std::cout << "Whether float objects allow denormalized values: "  
        << std::numeric_limits::has_denorm << std::endl;  
    std::cout << "Whether float objects can detect denormalized loss: "  
        << std::numeric_limits::has_denorm_loss << std::endl;  
    std::cout << "Whether float objects have quiet_NaN: "  
        << std::numeric_limits::has_quiet_NaN << std::endl;  
    std::cout << "Whether float objects have a signaling_NaN: "  
        << std::numeric_limits::has_signaling_NaN << std::endl;  
    std::cout << "The base for type float is:  "  
        << std::numeric_limits::radix << std::endl;  
    std::cout << "The maximum rounding error for type float is:  "  
        << std::numeric_limits::round_error() << std::endl;  
    std::cout << "The rounding style for a double type is: "  
        << std::numeric_limits::round_style << std::endl;  
    std::cout << "The signaling NaN for type float is:  "  
        << std::numeric_limits::signaling_NaN() << std::endl;  
    std::cout << "Whether float types can detect tinyness before rounding: "  
        << std::numeric_limits::tinyness_before << std::endl;  
    std::cout << "Whether float types have implemented trapping: "  
        << std::numeric_limits::traps << std::endl;  
  
    return 0;  
} 

         하지만 std::numericlimits 에 서 는 컴 파일 오류 가 자주 발생 합 니 다.
1>main.cpp(473):error C2059:문법 오류:":"
1>  main.cpp(474):warning C4003:"min"매크로 의 실제 인삼 이 부족 합 니 다.
 
      인터넷 에서 자 료 를 찾 아 보 니 이 잘못된 원인 을 알 게 되 었 다.windows.h 에서 min 매크로 를 정 의 했 고 그 중에서 도 이 정의 가 있 으 며 이들 은 충돌 했다.windows.h 에서 Microsoft 는 min/max 두 개의 매크로 를 정 의 했 습 니 다.에서 정 의 된 min/max 두 개의 매크로 는 자신의 네 임 스페이스 에 있 지만'오염'되 었 습 니 다.따라서 충돌 을 피 하려 면 windows.h 에서 정의 하 는 min 매크로 를 차단 해 야 합 니 다.구체 적 인 방법 은 모든 헤더 파일 앞에서(모든 것 을 주의 하 십시오)아래 의 예비 처리 문 구 를 추가 하 는 것 입 니 다.
#ifndef NOMINMAX                      
    #define NOMINMAX
#endif

참고 문헌:
1.C++/C++11 중 std::numericlimits 사용
2.opencv 프로 그래 밍 해결 warning C4003:"max"매크로 의 실제 인삼 부족

좋은 웹페이지 즐겨찾기