【发布时间】: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) >> 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