【问题标题】: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。或者只是将一个数字转换为双精度(如果还没有)

标签: c++ math sign


【解决方案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));

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-30
    • 1970-01-01
    • 2020-04-19
    • 1970-01-01
    相关资源
    最近更新 更多