有比较两个整数的绝对值的标准方法:
if (std::abs(a) > std::abs(b))
{
// code
}
有时我会遇到另一种基于值平方的绝对值比较方法:
if (a * a > b * b)
{
// code
}
这些方法等效吗?这些方法的性能是否有所不同?您想要哪种方法?
答案 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
,对于非零的a
和b
,该值不能永远相等。
答案 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;
}