【问题标题】:Which of these C "MAX" macros would be best?这些 C“MAX”宏中哪一个最好?
【发布时间】:2013-03-22 05:15:07
【问题描述】:

我在 C 中看到了 MAX 宏的两种可能实现方式。哪一种最好?

  1. define MAX(X,Y) ((X) < (Y) ? : (Y) : (X))
  2. define MAX(X,Y) 0.5*(X+Y+ABS(X-Y))

【问题讨论】:

  • 第二个选择是混淆的,复杂的,只能对浮点数正确工作,并且使用浮点运算而不是比较和选择。您提出它是否有任何原因,或者这是对 StackOverflow 用户“只是为了看看您是否在关注”的测试?
  • 直觉上(这对于性能决策来说总是一个糟糕的基础)我会说尽可能避免使用浮点数学。除此之外:对其进行基准测试!
  • 如果您从第一个选项中删除语法错误,它也会更好。
  • 让我们看看...这样使用会返回什么:MAX(++x, --y),假设 x、y 的先前值为 1、2?
  • MIN and MAX in C 的可能重复项

标签: c performance optimization definition


【解决方案1】:

第二个很难阅读,实际上已经坏了。真是个坏主意。

  1. 第二个总是使用双打。你会得到舍入错误。我当然不会期望得到不等于任何一方的结果。
  2. 当应用于整数时,它会返回一个双精度值,这非常令人惊讶。花车也被提升为双倍。
  3. 如果您通过将 *0.5 替换为 /2 来“修复”它,它会在其他类型上“工作”,但在大整数上会出现意外溢出。

我还推荐函数,而不是宏,这样参数就不会被计算两次。

在某些情况下,这种棘手的版本是合适的。例如计算常数时间中两个整数的最大值。但它们很少见,当然不应该用作MAX 的默认实现。

【讨论】:

  • 函数是一个很好的建议,但它们会迫使您选择一种类型。如果您希望 MAX 与任何数字类型一起使用,无需多次评估,也无需使用 gcc 扩展 (({})),那么您(我认为)就卡住了。
【解决方案2】:

第一个版本更通用、更高效、更容易理解。

第二个版本使用浮点常量,这使得它特定于双精度数。 它可能会返回错误的答案,因为浮点计算可能会四舍五入。 (由于二进制值无法准确表示每个可能的十进制值,例如 0.1) 还涉及更多的计算。 与 0.5 的乘积没有括在括号中,这可能会导致意外结果。

还有编译器优化的问题,但我不打算讨论。

【讨论】:

    猜你喜欢
    • 2019-10-21
    • 2022-01-15
    • 1970-01-01
    • 2010-10-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多