我想要一个函数,对于负数返回-1,对于正数返回+1。http://en.wikipedia.org/wiki/Sign_function编写我自己的代码很容易,但它似乎应该放在某个标准库中。
编辑:具体地说,我正在寻找一个处理浮点数的函数。
发布于 2011-01-06 06:19:57
令人惊讶的是,还没有人发布类型安全的C++版本:
template <typename T> int sgn(T val) {
return (T(0) < val) - (val < T(0));
}
好处:
copysign
速度很慢,特别是当你需要提升然后再缩小的时候。这是无分支的,并优化了excellently注意事项:
这是一个模板,所以在一些circumstances.
-Wtype-limits
警告。您可以通过使用一些重载来避免这种情况:模板内联常量return int signum(T x,std::false_type is_signed) { return T(0) < x;}模板内联常量return int signum(T x,std::true_type is_signed) {return (T(0) < x) - (x < T(0));}模板内联常量return int signum(T x) {return signum(x,std::is_signed());}
(这是第一个警告的一个很好的例子。)
发布于 2009-12-15 06:30:37
我不知道它的标准函数。不过,这里有一个有趣的方式来编写它:
(x > 0) - (x < 0)
下面是一种更具可读性的方法:
if (x > 0) return 1;
if (x < 0) return -1;
return 0;
如果你喜欢三元运算符,你可以这样做:
(x > 0) ? 1 : ((x < 0) ? -1 : 0)
发布于 2009-12-15 12:19:52
有一个名为C99 sign ()的拷贝数学库函数,它从一个参数中获取符号,从另一个参数中获取绝对值:
result = copysign(1.0, value) // double
result = copysignf(1.0, value) // float
result = copysignl(1.0, value) // long double
会给出+/- 1.0的结果,这取决于值的符号。请注意,浮点零是有符号的:(+0)将产生+1,而(-0)将产生-1。
https://stackoverflow.com/questions/1903954
复制相似问题