【问题标题】:Rounding of double to nearest member of an arithmetical progression?将双精度数舍入到算术级数的最近成员?
【发布时间】:2014-11-01 15:59:55
【问题描述】:

我有一个 double 数序列的公式k = a + d * n,其中 a 和 d 是常量 double 值,n 是整数,k >= 0,a >= 0。例如:

..., 300, 301.6, 303.2, 304.8, 306.4, ...

我想将给定的数字 c 舍入到该序列中小于 c 的最接近的值。

目前我使用这样的东西:

double someFunc(double c) {

    static double a = 1;
    static double d = 2;
    int n = 0;
    double a1 = a;
    if (c >= a) {

        while (a1 < c) {

            a1 += d;
        }
        a1 -= d;
    } else {

        while (a1 > c) {

            a1 -= d;
        }
    }
    return a1;
}

如果没有这些可怕的循环,是否可以做同样的事情?我问是因为可能会出现以下情况:

abs(a - c) &gt;&gt; abs(d)(第一个数字比第二个多得多,因此可以进行很多迭代)

My question is similar to the following one. 但在我的情况下,我还有一个a 变量,它会影响最终结果。这意味着一个序列可能没有数字 0。

【问题讨论】:

  • 使用一些数学运算并计算floor((c-a)/d),这将为您提供n 的近似值。然后计算a+d*n。我会把繁琐的容忍和 f-p 问题留给你。
  • 您可以将序列放入一个数组中,并使用像this one 这样的二进制搜索算法来快速找到您要查找的元素(索引)。我认为最小复杂度将保持O(n)

标签: algorithm math language-agnostic sequence intervals


【解决方案1】:

假设 c 是序列中的一个数字。然后你有n = (c - a) / d。 既然你想要一个整数 n = floor((c - a) / d)。 然后你可以将c四舍五入为:a + d * floor((c - a) / d)

假设 k = 3 + 5 * n 并且你舍入 c=21。

还有 3 + 5 * 楼层((21 - 3) / 5) = 3 + 5 * 3 = 18

【讨论】:

  • 除了n 之外,可能还想通过检查n-1n+1 来解决舍入错误(如a comment 中所暗示的那样)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-12-10
  • 2012-01-04
  • 2010-09-27
  • 1970-01-01
相关资源
最近更新 更多