我想要一个函数为负数返回-1,为正数返回+1。 http://en.wikipedia.org/wiki/Sign_function 我自己编写它很容易,但它似乎应该存在于某个标准库中。

编辑:具体来说,我正在寻找一个函数工作在浮动。


当前回答

如果您只想测试符号,则使用signbit(如果参数有负号则返回true)。 不知道为什么你特别想要返回-1或+1;复印件更方便 但在某些平台上,它会在负0时返回+1 仅部分支持负0,其中signbit可能会返回true。

其他回答

这个问题很老了,但现在有了这种理想函数。我用not, left shift和dec添加了一个包装器。

您可以使用C99中基于signbit的包装器函数来获得确切的期望行为(请参阅下面的代码)。

返回x的符号是否为负。 这也可以应用于无穷大,nan和零(如果零是无符号的,它被认为是正的

#include <math.h>

int signValue(float a) {
    return ((!signbit(a)) << 1) - 1;
}

注意:我使用operand not("!")是因为符号位的返回值没有指定为1(即使例子让我们认为它总是这样),但对于负数是真的:

返回值 如果x的符号为负,则为非零值(true);否则为零(false)。

然后我左移乘以2(“<< 1”),这将给我们一个正数2,一个负数0,最后减去1,分别得到1和-1的正数和负数,这是OP要求的。

如果您只想测试符号,则使用signbit(如果参数有负号则返回true)。 不知道为什么你特别想要返回-1或+1;复印件更方便 但在某些平台上,它会在负0时返回+1 仅部分支持负0,其中signbit可能会返回true。

不,它在c++中不存在,就像在matlab中一样。我在程序中使用宏来实现这一点。

#define sign(a) ( ( (a) < 0 )  ?  -1   : ( (a) > 0 ) )

似乎大多数答案都忽略了最初的问题。

在C/ c++中是否存在标准符号函数(signum, sgn) ?

在标准库中没有,但是有一个copysign可以通过copysign(1.0, arg)以几乎相同的方式使用,在boost中有一个真正的符号函数,它也可能是标准的一部分。

    #include <boost/math/special_functions/sign.hpp>

    //Returns 1 if x > 0, -1 if x < 0, and 0 if x is zero.
    template <class T>
    inline int sign (const T& z);
double signof(double a) { return (a == 0) ? 0 : (a<0 ? -1 : 1); }