我想要一个函数,对于负数返回-1,对于正数返回+1.
编辑:具体来说,我正在寻找一个处理浮动的函数.
我想要一个函数,对于负数返回-1,对于正数返回+1.
编辑:具体来说,我正在寻找一个处理浮动的函数.
类型安全的C++版本:
template <typename T> int sgn(T val) {
return (T(0) < val) - (val < T(0));
}
好处:
copysign
是缓慢的,尤其是如果你需要提升,然后再次缩小.这是无分支的,优化效果很好注意事项:
这是一个模板,因此在某些情况下可能需要更长的编译时间.
显然,有些人认为使用一个新的、有点深奥、速度非常慢的标准库函数that doesn't even really implement signum更容易理解.
当为未签名类型实例化时,判断的< 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>());
}
(这是第一条警告的一个很好的例子.)