有啥简单的方法可以检查两个数字是不是有不同的符号?
Posted
技术标签:
【中文标题】有啥简单的方法可以检查两个数字是不是有不同的符号?【英文标题】:Any simple way to check if two numbers have different signs?有什么简单的方法可以检查两个数字是否有不同的符号? 【发布时间】:2016-03-05 23:59:10 【问题描述】:我有两个浮点数a
和b
。我想检查他们是否有不同的迹象。最简单的方法是看
bool b = a * b < 0;
但是这两个数字非常小,a * b 可能会下溢。还有其他简单的检查方法吗?
如果有人认为这是一个重复的问题,请给我一个完全符合条件a * b < 0
的答案。请注意,我的问题中未定义 0 的符号。
【问题讨论】:
c++11 有signbit。所以,signbit(a) == signbit(b)
将是正确的,两者都具有相同的符号。
fwiw,vs2012 似乎没有符号位。不过,2013 年确实如此。你不能把一个数乘以一个大数,比如 1e20f 吗?为确保编译器不会对其重新排序,您可以创建一个 noinline 函数 no_reorder,它只返回其参数,然后使用 no_reorder(a*1e20f)*b。或者只是将一个数字转换为双精度(如果还没有)
【参考方案1】:
您可以按如下方式使用std::signbit:
bool c = std::signbit(a) == std::signbit(b);
LIVE DEMO
另一种方法是使用std::copysign,如下:
bool c = std::copysign(a,b) == a;
【讨论】:
不精确检查 a*b @user1899020 如果你的问题没问题,signbit
和 copysign
都会检测零、无穷大和 NaN 的符号位。
@user1899020 a 和 b 作为“快速检查”的副作用应该是错误的,但并不意味着对于不同的标志它应该是错误的
两个后续问题:1.性能与OP乘法比较的比较如何? 2.如何处理 +0 与 -0 尽管相等但符号不同(因此对于大多数应用程序而言“具有相同的一切,包括符号”)?【参考方案2】:
另一种解决方案是:
bool c = ((0 > a) == (0 > b));
【讨论】:
以上是关于有啥简单的方法可以检查两个数字是不是有不同的符号?的主要内容,如果未能解决你的问题,请参考以下文章
OpenCV - 检查两个图像是不是 100% 相同的最快方法