我想要一个返回负数为-1和正数为+1的函数。
http://en.wikipedia.org/wiki/Sign_function
编写我自己的代码很容易,但是似乎应该将它放在标准库中。
编辑:具体来说,我正在寻找对浮点数起作用的函数。
最佳答案
惊讶的是没有人发布过类型安全的C++版本:
template <typename T> int sgn(T val) {
return (T(0) < val) - (val < T(0));
}
好处:
copysign
速度很慢,特别是如果您需要提升然后再次缩小范围时。这是无分支的,并且优化了注意事项:
< 0
部分会触发GCC的-Wtype-limits
警告。您可以通过使用一些重载来避免这种情况: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>());
}
(这是第一个警告的好例子。)