有啥简单的方法可以检查两个数字是不是有不同的符号?

Posted

技术标签:

【中文标题】有啥简单的方法可以检查两个数字是不是有不同的符号?【英文标题】:Any simple way to check if two numbers have different signs?有什么简单的方法可以检查两个数字是否有不同的符号? 【发布时间】:2016-03-05 23:59:10 【问题描述】:

我有两个浮点数ab。我想检查他们是否有不同的迹象。最简单的方法是看

bool b = a * b < 0;

但是这两个数字非常小,a * b 可能会下溢。还有其他简单的检查方法吗?

如果有人认为这是一个重复的问题,请给我一个完全符合条件a * b &lt; 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 如果你的问题没问题,signbitcopysign 都会检测零、无穷大和 NaN 的符号位。 @user1899020 a 和 b 作为“快速检查”的副作用应该是错误的,但并不意味着对于不同的标志它应该是错误的 两个后续问题:1.性能与OP乘法比较的比较如何? 2.如何处理 +0 与 -0 尽管相等但符号不同(因此对于大多数应用程序而言“具有相同的一切,包括符号”)?【参考方案2】:

另一种解决方案是:

bool c = ((0 > a) == (0 > b));

【讨论】:

以上是关于有啥简单的方法可以检查两个数字是不是有不同的符号?的主要内容,如果未能解决你的问题,请参考以下文章

OpenCV - 检查两个图像是不是 100% 相同的最快方法

检查数组中两个不同数字的总和是不是等于变量数?

有啥方法可以检查 RedisTemplate 是不是存在密钥?

excl表格中数值型数据与字符型数据的输入有啥不同

有啥方法可以检查套接字连接是不是可用?

我的 discord.py 机器人有啥方法可以检查用户是不是具有使用命令的特定权限?