首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >在C/C++中有一个标准的符号函数(signum,sgn)吗?

在C/C++中有一个标准的符号函数(signum,sgn)吗?
EN

Stack Overflow用户
提问于 2009-12-15 06:27:15
回答 21查看 438.8K关注 0票数 461

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

编辑:具体地说,我正在寻找一个处理浮点数的函数。

EN

回答 21

Stack Overflow用户

回答已采纳

发布于 2011-01-06 06:19:57

令人惊讶的是,还没有人发布类型安全的C++版本:

代码语言:javascript
代码运行次数:0
运行
复制
template <typename T> int sgn(T val) {
    return (T(0) < val) - (val < T(0));
}

好处:

  • 实际上实现了signum (-1、0或1)。此处使用copysign的实现仅返回-1或1,这不是signum。此外,这里的一些实现返回的是浮点型(或T)而不是整型,这似乎对于整型、浮点型、双精度型、无符号短整型或任何可从整数0构造的自定义类型来说都是wasteful.
  • Works的,而orderable.
  • Fast!copysign速度很慢,特别是当你需要提升然后再缩小的时候。这是无分支的,并优化了excellently
  • Standards-compliant!bitshift hack很简洁,但只适用于某些位表示,当你有一个无符号类型时,它就不起作用了。在使用appropriate.
  • Accurate!时,可以将其作为手动专门化提供与零的简单比较可以保持机器的内部高精度表示(例如x87上的80位),并避免过早地舍入为零。

注意事项:

这是一个模板,所以在一些circumstances.

  • Apparently中编译可能需要更长的时间一些人认为使用一个新的,有些深奥的,非常慢的标准库函数,甚至没有真正实现signum更像是understandable.

  • The
  • 的一部分,当为无符号类型实例化时,会触发GCC的-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());}

(这是第一个警告的一个很好的例子。)

票数 569
EN

Stack Overflow用户

发布于 2009-12-15 06:30:37

我不知道它的标准函数。不过,这里有一个有趣的方式来编写它:

代码语言:javascript
代码运行次数:0
运行
复制
(x > 0) - (x < 0)

下面是一种更具可读性的方法:

代码语言:javascript
代码运行次数:0
运行
复制
if (x > 0) return 1;
if (x < 0) return -1;
return 0;

如果你喜欢三元运算符,你可以这样做:

代码语言:javascript
代码运行次数:0
运行
复制
(x > 0) ? 1 : ((x < 0) ? -1 : 0)
票数 300
EN

Stack Overflow用户

发布于 2009-12-15 12:19:52

有一个名为C99 sign ()的拷贝数学库函数,它从一个参数中获取符号,从另一个参数中获取绝对值:

代码语言:javascript
代码运行次数:0
运行
复制
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。

票数 220
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1903954

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档