绝对整数值比较和平方值比较。等价吗?

时间:2019-03-03 17:17:13

标签: c++ performance comparison

有比较两个整数的绝对值的标准方法:

if (std::abs(a) > std::abs(b))
{
   // code
}

有时我会遇到另一种基于值平方的绝对值比较方法:

if (a * a > b * b)
{
   // code
}

这些方法等效吗?这些方法的性能是否有所不同?您想要哪种方法?

3 个答案:

答案 0 :(得分:1)

仅当数字为 small 时,两者才等效。例如,如果您使用的是32位int,则a * a将在a = 50,000附近溢出,而a * a> b * b将给出完全错误的答案。

性能绝对没有意义。您位于此处的纳秒级节省区域。我更喜欢不会由于严重原因而失败的代码,因此比较绝对值是您应该做的。显然,这也是您的问题描述。

答案 1 :(得分:1)

直到整数乘积溢出,这两种方法将等效地起作用。我希望使用std::abs(),因为这样可以更清楚地说明我的意图-比较两个数字的大小。如果我使用产品a * a,那么其他通过代码阅读的维护者都会怀疑a * a的含义。

尽管超出了字面问题的范围,但我认为必须强调,对于非整数类型,这两种方法的分歧要快得多。对于浮点数,您很快会遇到舍入错误,导致比较稍有不同,有时可能会得出错误的结果(有人可能会说您不应该直接进行浮点数比较,而是要限制在一个范围内,但是仍然)。

更微妙的是,以这种方式比较complex值将是不正确的。复数a + bi的绝对值的典型计算为sqrt(a^2 + b^2),其中^表示幂。但是,(a + bi)^2将产生a^2-b^2 + 2abi,对于非零的ab,该值不能永远相等。

答案 2 :(得分:0)

如果数字的绝对值小于0,则返回其相反值;如果数字大于0,则返回其自身。

对数字进行平方运算将始终为您带来积极的结果, 因此比较整数平方与比较它们的绝对值相同。尽管这可能与浮点数不同。

简而言之,最好使用std::abs来提高可读性,并避免在使用浮点数时出现矛盾

编辑:

您可以使用此Timer类比较执行时间。只需在要测试的函数的开头声明此类的实例。

#include <ctime>
#include <chrono>
class Timer
{
  private:
    std::chrono::time_point<std::chrono::steady_clock> start;
    std::chrono::time_point<std::chrono::steady_clock> end;

  public:
    Timer()
    {
        start = std::chrono::high_resolution_clock::now();
    }
    ~Timer()
    {
        end = std::chrono::high_resolution_clock::now();
        auto duration = end - start;
        std::cout << "Function execution took  : " << duration.count() << " ns" << std::endl;
    }
};
int main()
{
    Timer t;
    return 0;
}