是否有标准标志函数 /signum, sgn/ 在 C/C++?

我需要一个返回的函数 -1 对于负数和 +1 对于正数。
http://en.wikipedia.org/wiki/Sign_function
很容易写自己,但它看起来像是应该在标准库中的某个地方。

Edit: 特别是,我正在寻找在浮子上运行的函数。
已邀请:

冰洋

赞同来自:

没有人惊讶地发布非octic,类型安全 C++ 版本更多:


template <typename t=""> int sgn/T val/ {
return /T/0/ &lt; val/ - /val &lt; T/0//;
}


好处:

实际上有所实施 signum /-1, 0 或者 1/. 在这里实现帮助 copysign 只返回值 -1 或者 1, 这不是 signum. 此外,这里有一些实现返回 float /或者 T/, 但不是 int, 看起来似乎是浪费的。

适用于整数,floats,重复的无符号短路,或任何用户类型的razagaging与数字 0 并订购。

快速地!
copysign

- 它很慢,特别是如果你需要促进然后再缩小。 它没有分支,完美优化

遵守! h bitshift 它小心,但仅适用于某些位表示,并且在您有未保存的类型时不起作用。 如有必要,可以作为手动专业化提供。

当然! 与零进行简单的比较可以保持机器的内部高精度呈现 /例如, 80 少量 x87/ 并避免过早舍入到零。

注意:

这是一种模式,所以它的汇编将需要一个全部。

显然,有些人认为使用一个新的,有点深奥和非常慢的标准库函数,

哪个甚至没有实施 signum

, 更能理解。

验证的一部分
&lt; 0

打电话给警告 GCC
-Wtype-limits

在没有符号的类型为类型创建实例时。 可以使用一些过载可以避免这一点:


template <typename t=""> inline constexpr
int signum/T x, std::false_type is_signed/ {
return T/0/ &lt; x;
}

template <typename t=""> inline constexpr
int signum/T x, std::true_type is_signed/ {
return /T/0/ &lt; x/ - /x &lt; T/0//;
}

template <typename t=""> inline constexpr
int signum/T x/ {
return signum/x, std::is_signed<t>///;
}


/第一次警告的一个很好的例子是什么。/
</t></typename></typename></typename></typename>

小明明

赞同来自:

我不知道他的标准功能。 但是,这是一个有趣的方式来写它:


/x > 0/ - /x < 0/


以下是一种更可读的方式来实现这一点:


if /x > 0/ return 1;
if /x < 0/ return -1;
return 0;


如果您喜欢Ternary操作员,您可以执行以下操作:


/x > 0/ ? 1 : //x < 0/ ? -1 : 0/

小明明

赞同来自:

有一个数学库函数 C99 名称 copysign//, 从另一个参数和绝对值中获取标志:


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.

詹大官人

赞同来自:

似乎大多数答案都错过了最初的问题。

是否有标准标志函数 /signum, sgn/ 在 C/C++?

不在标准图​​书馆 , 但是,有
http://en.cppreference.com/w/c ... ysign
, 这可以以几乎相同的方式使用
copysign/1.0, arg/

, 并且有一个功能 true sign 在
http://www.boost.org/doc/libs/ ... .html
, 这也可以是标准的一部分。


#include <boost math="" sign.hpp="" special_functions="">

//Returns 1 if x &gt; 0, -1 if x &lt; 0, and 0 if x is zero.
template <class t="">
inline int sign /const T&amp; z/;


http://www.boost.org/doc/libs/ ... .html
</class></boost>

快网

赞同来自:

显然,原始海报问题的答案不是。 没有

标准

功能 C++
sgn

.

小姐请别说爱

赞同来自:

是否有标准标志函数 /signum, sgn/ 在 C/C++?

是的,具体取决于定义。

C99 后来有一个宏
signbit//


<math.h>



int signbit

/真正的浮动
x

/;


signbit

返回非零值,然后只有当其参数值的符号为负。 C11 §7.12.3.6

但仍然 OP 想要一些不同的东西。

我需要一个返回的函数 -1 对于负数和 +1 对于正数。 ... 现场在浮子上运行。


#define signbit_p1_or_n1/x/ //signbit/x/ ? -1 : 1/


更深的

:

在以下情况下,该位置不具体。
x = 0.0, -0.0, +NaN, -NaN

.

古典
https://en.wikipedia.org/wiki/Sign_function
回报
+1


x&gt;0

,
-1


x&gt;0


0


x==0

.

许多答案已经涵盖了这个问题,但不影响
x = -0.0, +NaN, -NaN

. 其中许多是整数 point-of-view, 通常不包含 Not-a-Numbers /
https://en.wikipedia.org/wiki/NaN
/ 和
https://en.wikipedia.org/wiki/Signed_zero
.

典型的答案函数
signnum_typical//


-0.0, +NaN, -NaN

, 他们回来了
0.0, 0.0, 0.0

.


int signnum_typical/double x/ {
if /x &gt; 0.0/ return 1;
if /x &lt; 0.0/ return -1;
return 0;
}


相反,提供此功能:ON
-0.0, +NaN, -NaN

他回来了
-0.0, +NaN, -NaN

.


double signnum_c/double x/ {
if /x &gt; 0.0/ return 1.0;
if /x &lt; 0.0/ return -1.0;
return x;
}


</math.h>

二哥

赞同来自:

比以上决定更快,包括最高评级:


/x < 0/ ? -1 : /x > 0/

知食

赞同来自:

有一种方法可以在没有分支的情况下做到这一点,但它不是很漂亮。


sign = -/int///unsigned int///int/v/ >> /sizeof/int/ * CHAR_BIT - 1//;


http://graphics.stanford.edu/~ ... rSign
在这个页面上,太多了其他有趣的东西,太聪明了......

诸葛浮云

赞同来自:

如果您想要的只是检查标志,请使用
http://www.opengroup.org/onlin ... .html
/回报 true, 如果他的论点有负符号/.
我不知道为什么你特别想回来 -1 或者 +1; copysign 更方便
为此,但似乎他会回来 +1 对于某些平台上的负零
仅部分支持负零,在哪里 signbit 可能是回归 true.

莫问

赞同来自:

我的副本 C 简而言之,显示了称为标准函数的存在 copysign, 这可能是有用的。 看起来 copysign/1.0, -2.0/ 多窝白 -1.0, 和 copysign/1.0, 2.0/ 多窝白 +1.0.

相当亲密,是的?

要回复问题请先登录注册