为什么使用 abs() 或 fabs() 而不是条件否定?

新手上路,请多包涵

在 C/C++ 中,为什么要使用 abs()fabs() 来查找变量的绝对值而不使用以下代码?

 int absoluteValue = value < 0 ? -value : value;

它与较低级别的指令较少有关吗?

原文由 Subhranil 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 866
2 个回答

对于浮点数,您建议的“条件绝对值”不等于 std::abs (或 fabs ),参见例如

#include <iostream>
#include <cmath>

int main () {
    double d = -0.0;
    double a = d < 0 ? -d : d;
    std::cout << d << ' ' << a << ' ' << std::abs(d);
}

输出:

 -0 -0 0

给定 -0.00.0 代表相同的实数“0”,这种差异可能会或可能无关紧要,具体取决于结果的使用方式。但是,IEEE754 指定的 abs 函数要求结果的符号位为 0,这将禁止结果 -0.0 。我个人认为任何用于计算某些“绝对值”的东西都应该符合这种行为。

对于整数,两种变体在运行时和行为上都是等效的。 ( 现场示例

但是由于 std::abs (或合适的 C 等效项)已知是正确且易于阅读的,因此您应该始终更喜欢那些。

原文由 Baum mit Augen 发布,翻译遵循 CC BY-SA 4.0 许可协议

首先想到的是可读性。

比较这两行代码:

 int x = something, y = something, z = something;
// Compare
int absall = (x > 0 ? x : -x) + (y > 0 ? y : -y) + (z > 0 ? z : -z);
int absall = abs(x) + abs(y) + abs(z);

原文由 iBug 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题