【问题标题】:Best way to find minimal difference between two values in a cyclic system?找到循环系统中两个值之间最小差异的最佳方法?
【发布时间】:2021-02-18 11:09:42
【问题描述】:

以时间为例:

如果我们采用 12 小时制,我们会得到以下结果

  • 从 1 到 5 = 4
  • 从 5 到 1 = 4
  • 从 11 到 1 = 2
  • 从 1 到 11 = 2

最有效的方法是什么?

假设值是双精度值。

【问题讨论】:

  • 你尝试了什么?有 2 个可能的答案,选择较低的一个……有什么问题?
  • 这个帖子可能有帮助:stackoverflow.com/questions/1878907/…
  • min((12+a-b)%12,(12-a+b)%12)
  • 从 5 到 1 = 4。你能详细说明一下吗?

标签: c++ algorithm performance


【解决方案1】:

mod 是您的循环,并且假设两个输入值都小于mod,您可以使用:

int x = std::min((mod + a - b) % mod, (mod - a + b) % mod);

【讨论】:

  • 好吧,我刚刚注意到Assuming the values are doubles 的要求,这当然使这个解决方案无关紧要,因为模运算符% 仅针对整数定义。不确定如何在非整数上精确定义循环系统......
  • OP 想要 ab doubles
  • @idclev463035818:是的,我刚刚注意到,请参阅上面的评论。
  • 是的,几乎在同一秒发布。它只是一个很小的变化。 fmod 代替 %
  • 希望看到更高效的方式
【解决方案2】:

不使用模运算。 fabs 很便宜。

double closest_dist_in_cycle(double a, double b, double cycle){
    double result = std::fabs(a - b);
    return std::min(result, cycle - result);
}

参考:

How would fabs(double) be implemented on x86? Is it an expensive operation?

【讨论】:

    猜你喜欢
    • 2021-02-17
    • 1970-01-01
    • 2019-11-27
    • 2015-11-12
    • 1970-01-01
    • 2021-06-27
    • 2021-03-22
    • 1970-01-01
    • 2012-02-08
    相关资源
    最近更新 更多