부호만 빼내려면 어떻게 하나요?

인자는 float으로 들어올 거고

  • 음수가 들어오면 -1
  • 양수가 들어오면 1
  • 0이 들어오면 0 을 return해 주는 함수가 필요한데

이 기능을 하는 standard library function이 있을까요?

1답변

  • 좋아요

    0

    싫어요
    채택취소하기

    말씀하신것과 정확히 일치하는 standard library function는 아직 없고, 대신 제가 아는 방법을 알려드릴게요.

    방법1

    (x > 0) - (x < 0)
    
    //위 코드를 풀어쓰면
    if (x > 0) return 1;
    if (x < 0) return -1;
    return 0;
    

    방법2 - 삼항연산자

    (x > 0) ? 1 : ((x < 0) ? -1 : 0)

    방법3 - float외의 다른 type에서도 쓸 수 있는 코드

    template <typename T> int sgn(T val) {
        return (T(0) < val) - (val < T(0));
    }
    
    //< 0때문에 GCC가 -Wtype-limits warning을 내는걸 보고 싶지 않으면 다음 코드를 같이 쓰세요(선택)
    
    template <typename T> inline constexpr
    int signum(T x, std::false_type is_signed) {
        return T(0) < x;
    }
    
    template <typename T> inline constexpr
    int signum(T x, std::true_type is_signed) {
        return (T(0) < x) - (x < T(0));
    }
    
    template <typename T> inline constexpr
    int signum(T x) {
        return signum(x, std::is_signed<T>());
    }
    

    방법4 - C99/C++11의 math libaray에서 제공하는 copysign()

    함수 원형 )

    C99:

    • double copysign (double x , double y);
    • float copysignf (float x , float y);
    • long double copysignl (long double x, long double y);

    C++11:

    • double copysign (double x , double y);
    • float copysign (float x , float y);
    • long double copysign (long double x, long double y);
    • double copysign (Type1 x , Type2 y);

    사용법)

    #include <math.h> //C에서
    #include <cmath> //C++11에서
    ...
    float a = 1.0;
    result1 = copysign(1.0, a); //1.0
    result2 = copysign(10.0, a); //10.0
    

    단, floating point의 0은 부호가 있으니 쓸 때 주의하세요

    int main(){
        float fl1 = (0.0);
        float fl2 = (+0.0);
        float fl3 = (-0.0);
        cout << copysign(1.0, fl1) << endl; //1.0
        cout << copysign(1.0, fl2) << endl; //1.0
        cout << copysign(1.0, fl3) << endl; //-1.0
    }
    

ᕕ( ᐛ )ᕗ
로그인이 필요합니다

작성한 답변에 다른 개발자들이 댓글을 작성하거나 댓글에 좋아요/싫어요를 할 수 있기 때문에 계정을 필요로 합니다.