bve 1 30 августа, 2005 Опубликовано 30 августа, 2005 · Жалоба Есть задача - при вычислении длинного набора данных каждую точку необходимо умножать на коэффициент 1/(A+nd), где n - номер точки, A и d - постоянные. Кто-нибудь знает, как можно быстро реализовать такое умножение ( деление ). Рассуждая в терминах сигнальных процессоров - за один-два такта? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
vitus_strom 0 30 августа, 2005 Опубликовано 30 августа, 2005 · Жалоба Предварительно посчитать для каждой точки а потом сложить в кэш и умножать сколько влезет Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
bve 1 30 августа, 2005 Опубликовано 30 августа, 2005 · Жалоба Предварительно посчитать для каждой точки а потом сложить в кэш и умножать сколько влезет <{POST_SNAPBACK}> Да никакой памяти и времени не хватит на предварительный расчет. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
vitus_strom 0 30 августа, 2005 Опубликовано 30 августа, 2005 · Жалоба что так много точек? либо кордик но за 2-3 такта не прокатит Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Builder 0 30 августа, 2005 Опубликовано 30 августа, 2005 · Жалоба Какая длинна последовательности (максимальная), на чём считаем (float, doubel или ещё чего), какая требуется конечная точность? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
PowerF1 0 30 августа, 2005 Опубликовано 30 августа, 2005 · Жалоба А прямое вычисление почему не пойдет. 3десь три операции- сложение,умножение,деление. Умножение можно заменить на сложение- прибавлением к предыдущему значению конст. d. Вот два такта. Деление,понятно, позатратней будет Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Builder 0 30 августа, 2005 Опубликовано 30 августа, 2005 · Жалоба To PowerF1 Я к то-му же вёл, просто если последовательность длинная, а точность представления - низкая, то суммирование в не подойдет. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
bve 1 30 августа, 2005 Опубликовано 30 августа, 2005 · Жалоба Последовательность генериться кусками по 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) в ряд. Одно плохо - теряется значность, т.е. все быстро сводится к нулю... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
PowerF1 0 30 августа, 2005 Опубликовано 30 августа, 2005 · Жалоба Тогда можно использовать следующий алгоритм, только точность его невелика. Призводная от ln(A+nd) =1/(A+nd). Т.е. необходимо посчитать производную ln в точке n. Лучшая точность будет, если известны значения функции в соседних точках слева и справа (n-1, n+1). Но по-условию известны только предыдущие значения. Значит можно взять только один вариант- определять производную по 2-м предыдущим точкам (n-2, n-1). Конечно, точность может оказаться маленькой и ошибка будет накапливаться. Но это будет зависеть от вас. Можно, например, затабулировать с десяток первых значений, а считать начиная с 11-ой точки. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
bve 1 31 августа, 2005 Опубликовано 31 августа, 2005 · Жалоба Спасибо всем откликнувшимся на мою просьбу. Решение оказалось таким: Существует разложение 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 знаков. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
mse 0 11 сентября, 2005 Опубликовано 11 сентября, 2005 · Жалоба y=1/x y[n+1] = y[n](2 – x*y[n]). Количество точных бит удваивается при итерации. Или по таблице 1/х c линейной аппроксимацией, где 1<х<2. Для плывучки - ваще само то. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться