Перейти к содержанию
    

Как рекуррентно посчитать 1/X?

Есть задача - при вычислении длинного набора данных каждую точку необходимо

умножать на коэффициент 1/(A+nd), где n - номер точки, A и d - постоянные.

Кто-нибудь знает, как можно быстро реализовать такое умножение ( деление ).

Рассуждая в терминах сигнальных процессоров - за один-два такта?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Предварительно посчитать для каждой точки а потом сложить в кэш и умножать сколько влезет

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Предварительно посчитать для каждой точки а потом сложить в кэш и умножать сколько влезет

Да никакой памяти и времени не хватит на предварительный расчет.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Какая длинна последовательности (максимальная), на чём считаем (float, doubel или ещё чего), какая требуется конечная точность?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

А прямое вычисление почему не пойдет.

3десь три операции- сложение,умножение,деление. Умножение можно заменить на сложение- прибавлением к предыдущему значению конст. d. Вот два такта. Деление,понятно, позатратней будет

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

To PowerF1

Я к то-му же вёл, просто если последовательность длинная, а точность представления - низкая, то суммирование в не подойдет.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Последовательность генериться кусками по N точек, сама-по-себе - бесконечная.

Предполагается, что подсчитав в начале генерации очередного отрезка текущее

1/X, затем малым числом операций корректируем каждую точку в куске. Разбег с реальностью может быть небольшой, но вот как реализовать????

Пробовал представить, что 1/(A+nd)=exp(-ln(A+nd))=exp(-lnA-ln(1+nd/A))=

exp(-lnA)*exp(-ln(1+nd/A))=(1/A)*exp(-nd/A+(nd/A)**2/2-.....) согласно разложению

ln(1+x) в ряд. Одно плохо - теряется значность, т.е. все быстро сводится к нулю...

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Тогда можно использовать следующий алгоритм, только точность его невелика.

Призводная от ln(A+nd) =1/(A+nd). Т.е. необходимо посчитать производную ln в точке n. Лучшая точность будет, если известны значения функции в соседних точках слева и справа (n-1, n+1). Но по-условию известны только предыдущие значения. Значит можно взять только один вариант- определять производную по 2-м предыдущим точкам (n-2, n-1). Конечно, точность может оказаться маленькой и ошибка будет накапливаться. Но это будет зависеть от вас. Можно, например, затабулировать с десяток первых значений, а считать начиная с 11-ой точки.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Спасибо всем откликнувшимся на мою просьбу. Решение оказалось таким:

Существует разложение 1/(1+x)=1-x+x**2-x**3+......, где |x|<1.

Можно написать: (1/A)*(1/(1+nd/A)), A определяем на каждом куске, тогда-же считаем и 1/A. В результате получается рекуррентная формула:

Yn+1=Yn-(nd/A)*Yn*Yn, где Yn - искомое значение 1/(A+nd).

Чем больше A, тем лучше. Уже для значений порядка 50 точность после 512 рекурсий - до 6 знаков.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

y=1/x

y[n+1] = y[n](2 – x*y[n]). Количество точных бит удваивается при итерации.

Или по таблице 1/х c линейной аппроксимацией, где 1<х<2. Для плывучки - ваще само то.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...