Sat Aug 05 2006 10:06, Anatoly Mashanov wrote to All:
VV>>> А найти log2 с любой точностью - дело техники.
AM> Я как-то решал задачу: Вычислить время, за которое известный конденсатор AM> зарядился через известный резистор AM> Решалась методом, эквивалентным взятию логарифма по основанию 1+1/16. AM> Дело в том, что после приведения аргумента к промежутку от 1 до 1+1/16 AM> кривую логарифма на таком коротком отрезке можно аппроксимировать прямой. Да чего уж там. Логарифм вообще константа, а не функция :)
VLV
"Что даст мне свет, чего я сам не знаю?" (c) Гете "Фауст"
VV>>> А найти log2 с любой точностью - дело техники. AM> Я как-то решал задачу: Вычислить время, за которое известный AM> конденсатор зарядился через известный резистор от источника с AM> известным напряжением до измеренного на нем напряжения. Задача эта AM> эквивалентна логарифмированию. Решалась методом, эквивалентным взятию AM> логарифма по основанию 1+1/16. Дело в том, что после приведения AM> аргумента к промежутку от 1 до 1+1/16 кривую AM> логарифма на таком коротком отрезке можно аппроксимировать прямой. AM> Получилась точность, достаточная для обработки данных с 10-битного АЦП AM> ПИКа.
Только не точность, а разрешающая способность. Точность с середине отрезка получается всего около -3%, а это пять бит.
Когда я говорил о 129 точках для 12 бит, я имел ввиду конкретную формулу. То бишь, предполагаемую подставку и отсутвие начального участка. Разумеется это надо проверять с реальными их значениями, может я и слишком оптимистичен. Hу а про требуемую точность вообще не было ни слова.
Hello, Dmitry! You wrote to Alexander Torres on Sat, 05 Aug 2006 19:09:36 +0400:
DO>>>> Однофамилец DEO>>> я в fido после ~5 летнего перерыва вернулся. DEO>>> суммарно может месяц прошел как :) AT>>
AT>> Просто здесь раньше был Дима Обухов из Калифорнии. Hеужели это ты? :) DEO> в Калифорнии если я когда-нидь и буду то только как турист ну или как DEO> солдат. то есть обо мне никогда нельзя будет сказать что я из DEO> калифорнии :)
Очень хочеться на это надеяться :)
With best regards, Alexander Torres. E-mail: snipped-for-privacy@yahoo.com [ Жамству бой !]
В околоэхотажных применениях часто нужен "целочисленный" ллогарифм. Который считается как, буквально, номер первого ненулевого бита сллева. (биты нумерутся привы-ным образом, слева направо, на-иная с нулля).
05 Aug 06 09:44, Anatoly Mashanov wrote to Slav Matveev:
SM>> А log2 с любой точностью ты все равно будешь искать через SM>> подобный этому ряд: arg = arg * ((((((b6 * z + b5) * z + b4) SM>> * z + b3) * z + b2) * z + b1) * z + b0);
AM> Это в микроконтроллере-то я буду считать через ряд с невероятным AM> количеством умножений с плавучкой? если ресурсов хватает - почему бы и нет?
AM> точность, то с линейной (или даже нелинейной, если очень надо) AM> аппроксимацией промежуточных значений. здесь уже прозвучал совет: #include <math.h>
если ты думаешь что в стандартной библиотеке таблицы, скорее всего ты ошибаешься.
SM>>>> Я таким образом в отсутствии SM>>>> библиотек и наличии компилятора просчитал синусы/косинусы. SM>>>> Мне хватило четырех слагаемых в ряду. AM> А ты не учел, что твои 4 слагаемых в ряду тащат за собой: AM> преобразование целого в плавучку, плавающее умножение и плавающее AM> сложение? И что эти преобразования занимают места примерно столько же, AM> сколько таблица? в вопросе было про фиксированную точку. Это по-моему несколько упрощает вычисления своя их к целочисленным операциям. нет? И мне надо было ехать, а не шашечки рисовать. я доехал за два вечера. только вот уже не помню: "в лоб" считал или сначала таблицу с нужным шагом сделал.
04 Aug 06 20:27, Vladimir Vassilevsky wrote to Slav Matveev:
VV>>> Даже ряд не нужен. Log2 в диапазоне аргумента [1...2) это почти VV>>> линейная функция. Прекрасно апроксимируется. SM>> Линейной функцией апроксимируется с точностью до первого SM>> знака после запятой. Ты случаем не с аэромеха, у которых SM>> все что меньше 10 сравнимо с единицей?
VV> Hет, не с аэромеха. Если видишь мудака - знай, что он с ФРТК (это про VV> меня). ф-т радиотехники и ... ?
VV> Двоечникам с мехмата простительно не знать про апроксимацию по VV> Чебышеву. обижаешь. троечник. ну давай, расскажи про линейную апроксимацию с указанием погрешности log2 на [1..2) А потом спросим у вопрошавшего, устроит его плюс-минус километр или нет.
Sun Aug 06 2006 18:13, Slav Matveev wrote to Vladimir Vassilevsky:
VV>> Двоечникам с мехмата простительно не знать про апроксимацию по VV>> Чебышеву. SM> обижаешь. троечник.
Doh, cбавил мехмат свои стандарты... Починяй бензобаки и не лезь в высокие материи. SM> ну давай, расскажи про линейную апроксимацию с указанием SM> погрешности log2 на [1..2)
log2(x) ~ x - 0.957 Максимальная ошибка 4.3e-2, то есть лучше, чем одна цифра после запятой. Средняя точность примерно две цифры после запятой. И?
SM> А потом спросим у вопрошавшего, устроит его плюс-минус SM> километр или нет.
Проблема в том, что вопрошаюший сам не знает, чего ему надо.
VLV
"Что даст мне свет, чего я сам не знаю?" (c) Гете "Фауст"
WT>>> Требуется вычислять на ОМК (AVR - структуры) следующее выражение
WT>>> Y=А*Log(В*X) WT>>> Где А,В - константы WT>>> Х - меняется в диапазоне 1-65534 (реально точек меньше, потому WT>>> как Х=Х1+Х2, где Х2 некая фиксированная константа).
WT>>> Y - целое число в диапазоне 1-4094, А - масштабный коэффициент.
WT>>> Скорость вычисления не менее 4 вычислений в секунду. WT>>> Это вообще реально, на процессоре рангом пониже iP ?
YK>> Реально. AVR на частоте в 1МГц хватит за глаза. :-)
Как ты время, необходимое для расчета померять собираешься?
YK>> x = func(450); YK>> led_off(); YK>> } YK>> }
Вопервых необязательно иар. Скачай винавр и аврстудию, кракать не надо. Вовторых ты невнимательно эху читаешь (отн. иара)... Если всетаки winavr - посмотри в аврлибсе, там есть модуль math.h.
После компиляции симулятор аврстудии с твоей задачей справится без проблем. И обрати внимание, что тут уже писали о логарифмах (умножение -> сложение). Однако и вопросы у тебя... Nicolas
WT> В общем это ВАХ прямосмещенного германивого дида - какой она интересно функции подчиняется ? насколько я помню там чистая экспонента, а не логарифм. (U(I))
06 Aug 06 22:49, Vladimir Vassilevsky wrote to Slav Matveev:
SM>> погрешности log2 на [1..2)
VV> log2(x) ~ x - 0.957
метод наименьших квадратов?
VV> Максимальная ошибка 4.3e-2, то есть лучше, чем одна цифра после VV> запятой. Средняя точность примерно две цифры после запятой. И? ошибка во втором знаке это одна верная цифра после запятой. на 2/3 указанного интервала.
04 Aug 06 09:32, Wladimir Tchernov wrote to Slav Matveev:
WT> Исследованием схемы она должна быть близка к ВАХ прямосмещенного WT> точечного германивого диода. умноженной не EXP от интеграла входного WT> сигнала.
Как вариант разбей интервал на 2^N отрезков, на каждом апроксимируй линейной функцией ax+b.
В комплекте с твоим компилятором языка C для твоей целевой платформы.
Бывает да, бывает нет. Зависит от конкретного компилятора.
Если позарез нужно, то можно взять стороннюю библиотеку и адаптировать под твой компилятор и твою целевую платформу. (А исходники компилятора на всякий случай, не нужны? -- тогда только GCC...)
любой исходник libc например пакет для linux с таким именем возьми или любой компилятор расковыряй (правда в проприетарных продуктах могут оказаться только хидеры и dll, потому лучше смотреть в linux)
AM>> Это в микроконтроллере-то я буду считать через ряд с невероятным AM>> количеством умножений с плавучкой? Hет уж.
VB> А почему и нет ? Компилятор делает именно это. И на ASM я делал так же VB> (логарифмы заняли 113 слов программной памяти AVR,
А исходным текстом не поделишся.
Я тут с грехом пополам все-же откомпилировал в Си вычисление функции ... в общем знаний не хватает пока разобраться в килобайте с лишним кода.
VB> а базовый набор VB> 32-битной плавучки - меньше 400 слов). Если нет особых требований к VB> быстродействию - проще сделать стандартно и не выеживаться...
Будь счастлив(а) Vladislav... С уважением Wladimir.
KF> Я ничего не понял. Впрочем и не вникал. Хочу только сказать, что KF> ничто не мешает отсортировать список аргументов функции и её значений KF> и искать двоичным поиском за log2(N) времени,
А можно с этого места по подробнее, что-то никак не соображу.
Аргумент 1-65534 - это среднее значение периода. При 0,1 Гц - 65534, при 10 кГц
- 1
Итого 1,5 Гц на 1.
Функция нелинейна - быстро растет при малых аргуметах и мало меняется при больших.
Получается для каждого из 4096 результатов надо задать свой диапазон аргументов
- а это 3-4 байта на ячейку таблицы. Причем у одних значений диапазон аргументов огромен (сотни), а у других - только 1 значение.
KF> что для 4096 элементов KF> даст всего-то 12 операций сравнения. А этих элементов, очевидно, будет KF> в Nдцатьц раз меньше. Будет там что-то кратно двум или нет -- KF> совершенно не важно (что может позволить уменьшить ошибку KF> аппроксимации). Речь о применительности линейной интерполяции к задаче KF> озвученной WT.
04 Авг 06 17:20, Dmitry E. Oboukhov -> Andrey Arnold:
AA>> Да я вроде понял. AA>> А в случае логарифма, там вообще просто получается. AA>> Hо у него тут есть оффсет, а это "ставит повторяемость функции" AA>> в довольно сложное положение.;) DO> у логарифма повторяемость тоже такая же DO> только она повторяться будет на диапазоне основания.
DO> а вот чтобы отмасштабировать результат табличный до нужного надо DO> подумать, похоже надо будет в степень основания вводить или корень DO> брать. DO> корень сложнее, а вот если основание и правда взять равным двум, то DO> тут можно поиграться (но таблицу надо собирать для такого диапазона DO> чтобы результат масштабировтаь только в бОльшую сторону)
Тоесть применить таблицу для аргументов 0,1-1, а затем еще и множители (х10, х100 .... х100000) ?
DO> мм DO> умножение
DO> надо подумать может масштабирование заменить аналогичным действием? DO> то есть две таблицы - логарифм и масштаб
ElectronDepot website is not affiliated with any of the manufacturers or service providers discussed here.
All logos and trade names are the property of their respective owners.