我想要一个函数为负数返回-1,为正数返回+1。 http://en.wikipedia.org/wiki/Sign_function 我自己编写它很容易,但它似乎应该存在于某个标准库中。
编辑:具体来说,我正在寻找一个函数工作在浮动。
我想要一个函数为负数返回-1,为正数返回+1。 http://en.wikipedia.org/wiki/Sign_function 我自己编写它很容易,但它似乎应该存在于某个标准库中。
编辑:具体来说,我正在寻找一个函数工作在浮动。
当前回答
有一种不用分支的方法,但不太好。
sign = -(int)((unsigned int)((int)v) >> (sizeof(int) * CHAR_BIT - 1));
http://graphics.stanford.edu/~seander/bithacks.html
那一页上还有很多其他有趣的、过于聪明的东西……
其他回答
如果boost可用,可以使用boost/math/special_functions/sign.hpp中的boost::math::sign()方法。
显然,最初的帖子的问题的答案是否定的。没有标准的c++ sgn函数。
这个问题很老了,但现在有了这种理想函数。我用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要求的。
int sign(float n)
{
union { float f; std::uint32_t i; } u { n };
return 1 - ((u.i >> 31) << 1);
}
这个函数假设:
浮点数的二进制32表示 在使用命名联合时对严格的混叠规则做出例外的编译器
虽然接受的答案中的整数解决方案相当优雅,但它不能为双类型返回NAN,因此我对它进行了稍微修改。
template <typename T> double sgn(T val) {
return double((T(0) < val) - (val < T(0)))/(val == val);
}
请注意,返回一个浮点NAN而不是硬编码NAN会导致在某些实现中设置符号位,因此val = -NAN和val = NAN的输出无论如何都是相同的(如果你更喜欢“NAN”输出而不是-NAN,你可以在返回之前放一个abs(val)…)