부호만 빼내려면 어떻게 하나요?
조회수 6785회
인자는 float
으로 들어올 거고
- 음수가 들어오면 -1
- 양수가 들어오면 1
- 0이 들어오면 0 을 return해 주는 함수가 필요한데
이 기능을 하는 standard library function이 있을까요?
1 답변
-
말씀하신것과 정확히 일치하는 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 }
댓글 입력