2014-11-01 2 views
0

У меня есть формула последовательности двойных чисел k = a + d * n, где а и d являются постоянными двойными значениями, п представляет собой целое число, к> = 0, а> = 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.

+2

Используйте некоторые математики и вычислить 'пол ((са)/d)', который даст вам приближение к 'n'. Затем вычислите 'a + d * n'. Я оставлю вам вопросы о терпимости и f-p. –

+0

Вы можете поместить последовательность в массив и использовать алгоритм бинарного поиска, например [этот] (http://www.java2s.com/Code/Java/Collections-Data-Structure/Findtheindexofthearraynearesttothevalue.htm), чтобы быстро найти элемент (индекс), который вы ищете. Я думаю, что минимальная сложность останется «O (n)». –

ответ

3

Предположим, что c - это число в вашей последовательности. Тогда у вас есть n = (c - a)/d. Поскольку вы хотите целое число < = c, затем возьмите 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

+0

Возможно, вам нужно учитывать ошибки округления, проверив «n-1' и' n + 1 »в дополнение к' n' (как указано в [комментарии] (http://stackoverflow.com/questions/26691053/rounding- из-дабл к ближайшей-членом-оф-ан-арифметической прогрессии-# comment41978647_26691053)) – anatolyg

Смежные вопросы