有一种比较两个整数绝对值的标准方法:
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
,对于非零 a
和 b
。
关于c++ - 绝对整数值比较和平方值比较。是等价的吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54971542/