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


인자는 float으로 들어올 거고

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

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

  • 2016년 01월 15일에 작성됨

조회수 221


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
}
  • 2016년 01월 15일에 작성됨

로그인이 필요한 기능입니다.

Hashcode는 개발자들을 위한 무료 QnA사이트 입니다. 작성한 답변에 다른 개발자들이 댓글을 작성하거나 좋아요/싫어요를 할 수 있기 때문에 계정을 필요로 합니다.
► 로그인
► 계정만들기
Close