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

14

我有两个浮点数ab。我想检查它们是否具有不同的符号。简单的方法是判断它们是否符号相反。

bool b = a * b < 0;

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

如果有人认为这是一个重复的问题,请给我一个完全符合条件 a * b < 0 的答案。请注意,在我的问题中,0的符号未定义。


4
C++11拥有signbit函数。因此,当两个数a和b的符号相同时,表达式signbit(a) == signbit(b)的值将为真。 - wendelbsilva
就此而言,VS2012似乎没有signbit。不过2013有。 你不能只是将一个数字乘以一个大数,比如1e20f吗?为了确保编译器不会重新排序,你可以创建一个no_reorder函数,它是一个noinline函数,只返回其参数,然后使用no_reorder(a*1e20f)*b。 或者,如果还没有,将一个数字转换为double类型。 - Anton Knyazyev
2个回答

9

您可以按照以下方式使用std::signbit

bool c = std::signbit(a) == std::signbit(b);

实时演示

另一种方法是使用std::copysign,如下所示:

bool c = std::copysign(a,b) == a;

不精准检查 a*b < 0。a和b也可以为0。检查(1) a=1,b=0 (2) a=-1,b=0。两者都应该为false。 - user1899020
如果我理解你的问题正确,signbitcopysign都可以检测零、无穷大和NaN的符号位。 - 101010
@user1899020,根据您的“快速检查”,a和b应该为false,但这并不意味着对于不同的符号它们也应该为false。 - Slava
两个后续问题:1. 性能如何与基于OP乘法的比较相比?2. 如何处理+0与-0具有不同符号但相等(因此对于大多数应用程序而言,“包括符号在内的所有内容都相同”)的情况? - Michael

2
另一种解决方案是:
bool c = ((0 > a) == (0 > b));

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接