c++ - 绝对整数值比较和平方值比较。是等价的吗?

标签 c++ performance comparison

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

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

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

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

这些方法是否等价?这些方法的性能有区别吗?您更喜欢哪种方法?

最佳答案

在整数乘积溢出之前,这两种方法的行为是等价的。我更喜欢使用 std::abs() 因为这更清楚地说明了我的意图 - 比较两个数字的大小。如果我使用产品 a * a,任何其他阅读代码的维护人员都会想知道 a * a 表示什么。

虽然超出了字面问题的范围,但我觉得有必要强调这两种方法对于非整数类型的差异更快。对于 float ,你会很快遇到舍入错误,导致比较略有不同,有时可能会给出错误的结果(有人可能会争辩说你不应该做直接的 float 比较,而是限制在一个范围内,但是仍然)。

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

关于c++ - 绝对整数值比较和平方值比较。是等价的吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54971542/

相关文章:

c++ - 确定函数签名

performance - 快速的,抽象类或接口(interface)是哪一个?

sql - 相同 SQL 查询在一个数据库中运行的时间比在同一服务器下的另一个数据库中运行的时间长

mysql - 记录 MySQL Diff 的方法?

command-line - 用于 XML 架构 (XSD) 比较的 FOSS(命令行)工具?

Python - 比较文件

c++ - 在 O(1) 复杂度中连接 C++ 中的两个列表

c++ - 高效访问存储为一维数组的 3D 数组

c++ - 结构中的字段跳过字节

sql - 为什么添加一个窗口函数会使这个查询变得如此缓慢?