Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/search/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 有没有简单的方法来检查两个数字是否有不同的符号?_C++_Math_Sign - Fatal编程技术网

C++ 有没有简单的方法来检查两个数字是否有不同的符号?

C++ 有没有简单的方法来检查两个数字是否有不同的符号?,c++,math,sign,C++,Math,Sign,我有两个浮点数a和b。我想看看他们是否有不同的标志。最简单的方法就是看 bool b = a * b < 0; bool b=a*bb)) c++11已经实现了。因此,当两者都有相同的符号时,signbit(a)==signbit(b)将为真。fwiw,vs2012似乎没有signbit。但2013年确实如此。你不能用一个大数字乘以一个大数字,比如1e20f吗?为了确保编译器不会对其进行重新排序,可以创建一个noinline函数no_reorder,该函数只返回其参数,然后使用no_re

我有两个浮点数
a
b
。我想看看他们是否有不同的标志。最简单的方法就是看

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

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

您可以使用以下符号:

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

另一种方法是按如下方式使用:

bool c = std::signbit(a) == std::signbit(b);
bool c = std::copysign(a,b) == a;
另一个解决办法是:


boolc=((0>a)=(0>b))

c++11已经实现了。因此,当两者都有相同的符号时,
signbit(a)==signbit(b)
将为真。fwiw,vs2012似乎没有signbit。但2013年确实如此。你不能用一个大数字乘以一个大数字,比如1e20f吗?为了确保编译器不会对其进行重新排序,可以创建一个noinline函数no_reorder,该函数只返回其参数,然后使用no_reorder(a*1e20f)*b。或者将一个数字转换成一个不精确的双精度(如果还没有的话)来检查a*b<0。a和b也可以是0。检查(1)a=1,b=0(2)a=-1,b=0都应该为假。@user1899020如果我答对了你的问题,那么
signbit
copysign
都检测零、无限和NaN的符号位。@user1899020 a和b应该为假,作为“快速检查”的副作用但这并不意味着对于不同的信号,它应该是错误的。两个后续问题:1。性能如何与基于运算乘法的比较进行比较?2.如何处理+0与-0在相等的情况下具有不同的符号(因此在大多数应用程序中“具有相同的一切,包括符号”)?