我想要一个函数为负数返回-1,为正数返回+1。 http://en.wikipedia.org/wiki/Sign_function 我自己编写它很容易,但它似乎应该存在于某个标准库中。
编辑:具体来说,我正在寻找一个函数工作在浮动。
我想要一个函数为负数返回-1,为正数返回+1。 http://en.wikipedia.org/wiki/Sign_function 我自己编写它很容易,但它似乎应该存在于某个标准库中。
编辑:具体来说,我正在寻找一个函数工作在浮动。
当前回答
如果您只想测试符号,则使用signbit(如果参数有负号则返回true)。 不知道为什么你特别想要返回-1或+1;复印件更方便 但在某些平台上,它会在负0时返回+1 仅部分支持负0,其中signbit可能会返回true。
其他回答
我的《C in a Nutshell》揭示了一个叫做copysign的标准函数的存在,它可能很有用。看起来,copyysign(1.0, -2.0)将返回-1.0,而copyysign(1.0, 2.0)将返回+1.0。
很接近吧?
显然,最初的帖子的问题的答案是否定的。没有标准的c++ sgn函数。
如果boost可用,可以使用boost/math/special_functions/sign.hpp中的boost::math::sign()方法。
有一种不用分支的方法,但不太好。
sign = -(int)((unsigned int)((int)v) >> (sizeof(int) * CHAR_BIT - 1));
http://graphics.stanford.edu/~seander/bithacks.html
那一页上还有很多其他有趣的、过于聪明的东西……
在C/ c++中是否存在标准符号函数(signum, sgn) ?
是的,这取决于定义。
C99及以后版本在<math.h>中有signbit()宏
Int符号位(实浮点x); signbit宏当且仅当其参数值的符号为负时返回一个非零值。C11§7.12.3.6
然而OP想要一些不同的东西。
我想要一个函数,返回-1的负数和+1的正数. ...处理浮点数的函数。
#define signbit_p1_or_n1(x) ((signbit(x) ? -1 : 1)
更深层次的问题:
OP的问题在以下情况下不是特定的:x = 0.0, -0.0, +NaN, -NaN。
经典的signum()在x>0时返回+1,在x<0时返回-1,在x==0时返回0。
许多答案已经涵盖了这一点,但没有涉及x = -0.0, +NaN, -NaN。许多都是针对通常缺少Not-a-Numbers (NaN)和-0.0的整数观点。
典型答案函数如signnum_typical()在-0.0,+NaN, -NaN上,它们返回0.0,0.0,0.0。
int signnum_typical(double x) {
if (x > 0.0) return 1;
if (x < 0.0) return -1;
return 0;
}
相反,我建议这样的功能:在-0.0,+NaN, -NaN上,它返回-0.0,+NaN, -NaN。
double signnum_c(double x) {
if (x > 0.0) return 1.0;
if (x < 0.0) return -1.0;
return x;
}