реклама на сайте
подробности

 
 
 
Reply to this topicStart new topic
> Как рекуррентно посчитать 1/X?, Нужен алгоритм
bve
сообщение Aug 30 2005, 05:37
Сообщение #1


Местный
***

Группа: Свой
Сообщений: 316
Регистрация: 20-02-05
Из: Ленинградская обл.
Пользователь №: 2 765



Есть задача - при вычислении длинного набора данных каждую точку необходимо
умножать на коэффициент 1/(A+nd), где n - номер точки, A и d - постоянные.
Кто-нибудь знает, как можно быстро реализовать такое умножение ( деление ).
Рассуждая в терминах сигнальных процессоров - за один-два такта?
Go to the top of the page
 
+Quote Post
vitus_strom
сообщение Aug 30 2005, 06:29
Сообщение #2


Знающий
****

Группа: Свой
Сообщений: 553
Регистрация: 15-10-04
Пользователь №: 877



Предварительно посчитать для каждой точки а потом сложить в кэш и умножать сколько влезет
Go to the top of the page
 
+Quote Post
bve
сообщение Aug 30 2005, 08:12
Сообщение #3


Местный
***

Группа: Свой
Сообщений: 316
Регистрация: 20-02-05
Из: Ленинградская обл.
Пользователь №: 2 765



Цитата(vitus_strom @ Aug 30 2005, 09:29)
Предварительно посчитать для каждой точки а потом сложить в кэш и умножать сколько влезет
*

Да никакой памяти и времени не хватит на предварительный расчет.
Go to the top of the page
 
+Quote Post
vitus_strom
сообщение Aug 30 2005, 08:23
Сообщение #4


Знающий
****

Группа: Свой
Сообщений: 553
Регистрация: 15-10-04
Пользователь №: 877



что так много точек?
либо кордик но за 2-3 такта не прокатит
Go to the top of the page
 
+Quote Post
Builder
сообщение Aug 30 2005, 11:06
Сообщение #5


iBuilder©
****

Группа: Свой
Сообщений: 519
Регистрация: 14-07-04
Из: Минск
Пользователь №: 322



Какая длинна последовательности (максимальная), на чём считаем (float, doubel или ещё чего), какая требуется конечная точность?
Go to the top of the page
 
+Quote Post
PowerF1
сообщение Aug 30 2005, 11:29
Сообщение #6


Участник
*

Группа: Новичок
Сообщений: 34
Регистрация: 12-03-05
Из: Новосибирск
Пользователь №: 3 288



А прямое вычисление почему не пойдет.
3десь три операции- сложение,умножение,деление. Умножение можно заменить на сложение- прибавлением к предыдущему значению конст. d. Вот два такта. Деление,понятно, позатратней будет
Go to the top of the page
 
+Quote Post
Builder
сообщение Aug 30 2005, 12:32
Сообщение #7


iBuilder©
****

Группа: Свой
Сообщений: 519
Регистрация: 14-07-04
Из: Минск
Пользователь №: 322



To PowerF1
Я к то-му же вёл, просто если последовательность длинная, а точность представления - низкая, то суммирование в не подойдет.
Go to the top of the page
 
+Quote Post
bve
сообщение Aug 30 2005, 13:42
Сообщение #8


Местный
***

Группа: Свой
Сообщений: 316
Регистрация: 20-02-05
Из: Ленинградская обл.
Пользователь №: 2 765



Последовательность генериться кусками по 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) в ряд. Одно плохо - теряется значность, т.е. все быстро сводится к нулю...
Go to the top of the page
 
+Quote Post
PowerF1
сообщение Aug 30 2005, 15:09
Сообщение #9


Участник
*

Группа: Новичок
Сообщений: 34
Регистрация: 12-03-05
Из: Новосибирск
Пользователь №: 3 288



Тогда можно использовать следующий алгоритм, только точность его невелика.
Призводная от ln(A+nd) =1/(A+nd). Т.е. необходимо посчитать производную ln в точке n. Лучшая точность будет, если известны значения функции в соседних точках слева и справа (n-1, n+1). Но по-условию известны только предыдущие значения. Значит можно взять только один вариант- определять производную по 2-м предыдущим точкам (n-2, n-1). Конечно, точность может оказаться маленькой и ошибка будет накапливаться. Но это будет зависеть от вас. Можно, например, затабулировать с десяток первых значений, а считать начиная с 11-ой точки.
Go to the top of the page
 
+Quote Post
bve
сообщение Aug 31 2005, 07:38
Сообщение #10


Местный
***

Группа: Свой
Сообщений: 316
Регистрация: 20-02-05
Из: Ленинградская обл.
Пользователь №: 2 765



Спасибо всем откликнувшимся на мою просьбу. Решение оказалось таким:
Существует разложение 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 знаков.
Go to the top of the page
 
+Quote Post
mse
сообщение Sep 11 2005, 07:08
Сообщение #11


Знающий
****

Группа: Свой
Сообщений: 709
Регистрация: 3-05-05
Пользователь №: 4 693



y=1/x
y[n+1] = y[n](2 – x*y[n]). Количество точных бит удваивается при итерации.
Или по таблице 1/х c линейной аппроксимацией, где 1<х<2. Для плывучки - ваще само то.
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
2 чел. читают эту тему (гостей: 2, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 23rd July 2025 - 03:24
Рейтинг@Mail.ru


Страница сгенерированна за 0.01546 секунд с 7
ELECTRONIX ©2004-2016