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

 
 
 
Reply to this topicStart new topic
> Логарифм, Вычесление логарифма
vov136
сообщение Aug 31 2004, 03:24
Сообщение #1





Группа: Новичок
Сообщений: 1
Регистрация: 31-08-04
Пользователь №: 569



Помогите пожалуста можно ли зашить в МК, и в какой, вычисление десятичного логарифма? Заранее благодарен.
Go to the top of the page
 
+Quote Post
KRS
сообщение Aug 31 2004, 08:34
Сообщение #2


Профессионал
*****

Группа: Модераторы
Сообщений: 1 951
Регистрация: 27-08-04
Из: Санкт-Петербург
Пользователь №: 555



Да в любой можно запихать wink.gif
вопрос в точности и скорости
Go to the top of the page
 
+Quote Post
Himer
сообщение Aug 31 2004, 09:00
Сообщение #3


Участник
*

Группа: Свой
Сообщений: 51
Регистрация: 22-06-04
Из: Riga,Latvia
Пользователь №: 104



Насколько помню из математики логарифм через ряд вычеслялся, то есть тебе нужно будет циклически умножать, делить и складывать, причем точность зависит от числа операций и соответственно времени вычесления. Да и еще если хочешь все это дело побыстрее то нужен контроллер как минимум с аппаратным умножением, а лучше и с аппаратным делением и с MAC(multiply accomulate) инструкциями. То биш на DSP лучше делать если скорость и точность нужна.
Go to the top of the page
 
+Quote Post
Kot
сообщение Sep 24 2004, 01:18
Сообщение #4





Группа: Свой
Сообщений: 12
Регистрация: 24-09-04
Из: Харьков
Пользователь №: 711



Если много лишней smile.gif памяти и мало времени - табличный метод рулит.
Go to the top of the page
 
+Quote Post
-Tумблер-
сообщение Nov 5 2004, 14:19
Сообщение #5


Частый гость
**

Группа: Свой
Сообщений: 146
Регистрация: 4-11-04
Из: Московская область
Пользователь №: 1 040



Цитата(vov136 @ Aug 31 2004, 07:24 AM)
Помогите пожалуста можно ли зашить в МК, и в какой, вычисление десятичного логарифма? Заранее благодарен.


В библиотеках С-компилеров просто должна быть
готовая функция.
:P


--------------------

- ЗАМЕНЯТЬ ДЕТАЛИ НА ХОДУ ВОСПРЕЩАЕТСЯ !!! -
Go to the top of the page
 
+Quote Post
Starick
сообщение Mar 30 2006, 14:31
Сообщение #6


Участник
*

Группа: Участник
Сообщений: 34
Регистрация: 4-09-05
Пользователь №: 8 211



Цитата(-Tумблер- @ Nov 5 2004, 17:19) *
Цитата(vov136 @ Aug 31 2004, 07:24 AM)
Помогите пожалуста можно ли зашить в МК, и в какой, вычисление десятичного логарифма? Заранее благодарен.


В библиотеках С-компилеров просто должна быть
готовая функция.
:P

Ага...только при использовании этой функции флэш забивается чуть ли не на половину (У меги 8535)!!! Я уже молчу о времени выполнения данной функции.....быстрее было бы на калькуляторе просчитать blink.gif
Так что советую два выхода:
- либо численные методы, как было сказано выше.
- либо ставь сопроцессор, который бы тебе считал логарифм, сооствественно с вытекающими последствиями
Go to the top of the page
 
+Quote Post
defunct
сообщение Mar 31 2006, 01:10
Сообщение #7


кекс
******

Группа: Свой
Сообщений: 3 825
Регистрация: 17-12-05
Из: Киев
Пользователь №: 12 326



Цитата(Starick @ Mar 30 2006, 16:31) *
Ага...только при использовании этой функции флэш забивается чуть ли не на половину (У меги 8535)!!! Я уже молчу о времени выполнения данной функции.....быстрее было бы на калькуляторе просчитать blink.gif
Так что советую два выхода:
- либо численные методы, как было сказано выше.
- либо ставь сопроцессор, который бы тебе считал логарифм, сооствественно с вытекающими последствиями


Что-то не сходится.. Ну не может функция расчета логарифма занимать пол-флеша у mega8535. Одно из двух либо она будет работать очень быстро (если столько памяти занимает) либо вы что-то преврали.
В общем стандартное решение:
#include <math.h>

y = log10(x);
Go to the top of the page
 
+Quote Post
impuls-v
сообщение Apr 2 2006, 11:53
Сообщение #8


Частый гость
**

Группа: Свой
Сообщений: 130
Регистрация: 15-01-06
Пользователь №: 13 190



Флеш забивается потому что ты используеш всю библиотеку math.h проше вытащить из нее вычисление логарифма и вставить в программу. Ну а по поводу времени вычисления можно посчитать это время, а мож человеко оно и нормально подойдет.
Go to the top of the page
 
+Quote Post
AndyBig
сообщение Apr 2 2006, 18:11
Сообщение #9


Иногдящий
****

Группа: Свой
Сообщений: 691
Регистрация: 28-02-05
Пользователь №: 2 931



Цитата
Флеш забивается потому что ты используеш всю библиотеку math.h

Вообще-то линкер должен брать только используемые функции, а не всю библиотеку smile.gif.
Go to the top of the page
 
+Quote Post
radamateur
сообщение Apr 2 2006, 18:15
Сообщение #10





Группа: Новичок
Сообщений: 3
Регистрация: 4-01-06
Пользователь №: 12 830



Цитата
Что-то не сходится.. Ну не может функция расчета логарифма занимать пол-флеша у mega8535. Одно из двух либо она будет работать очень быстро (если столько памяти занимает) либо вы что-то преврали.
В общем стандартное решение:
#include <math.h>

y = log10(x);


Вообще-то используя строку :

#include <math.h>

кроме логарифмической функции попадает куча ненужной информации,
что приводит к быстрому расходу памяти в микроконтроллере, оссобенно в tiny и classic.
Предлагаю использовать примерно такую функцию для всех x>0 ( вместо log (x) log_x (x),
а вместо log10 (x) log10_x (x) ):

double log_x (double );

double log_x (double x){
int m= ; /* (m-длина ряда, целое число) присвойте m значение , чем больше длина ряда,
тем точнее значение логарифма, но тем дольше идет его расчет */

double b,c,d,e,f;
b=(x-1)/(x+1);
с=b*b;
d=1/b;
f=0;
e=-1;
while (m>0){
d*=c;
e+=2;
f+=(d/e);
m--;
}
f*=2;
return f;
}

А для вычисления десятичного логарифма важно помнить след. соотношение:
lg (x) = ln (x) / ln (10 ) , а точнее это будет выглядеть так :

log10_x (x) = log_x (x)/log_x (10);
Go to the top of the page
 
+Quote Post
radamateur
сообщение Apr 4 2006, 17:13
Сообщение #11





Группа: Новичок
Сообщений: 3
Регистрация: 4-01-06
Пользователь №: 12 830



А вот для десятичного логарифма и к тому-же работаяющая гораздо быстрее.
Для достаточно больших x, требуеся достаточно большая длина ряда. В нижеприведенной функции
x преобразуется к виду 1<x<10, а далее вычисляется десятичный логарифм. Точность L= 10^(-6),
если нужна большая - увеличьте длину ряда m исходя из соотношения :

(9/11)^(2*m-1) < L/(100*(2*m-1))

В данном случае L=10^(-6) т.е. m=36


double log10_x (double );

double log10_x (double x){
int m= 36; // m-длина ряда, целое число

double a,b,c,d,e,f,g,i,j;

if (x==1) return 0;

a=x;
i=1;
if (x<1){
a=1/x;
i=-1;
}

j=0;
while (a>10){
a/=10;
j++;
}

if (a==10){
j++;
return i*j;
}

b=(a-1)/(a+1);
с=b*b;
d=1/b;
f=0;
e=-1;
while (m>0){
d*=c;
e+=2;
g=d/e;
f+=g;
m--;
}
f*=2;
f*=0.43429448; // для точности 10^(-6)
// округлите 1/ln(10) до 7-го знака, для 10^(-7) до 8-го и т.д..
f+=j;
f*=i;

return f;
}
Go to the top of the page
 
+Quote Post
vitus_strom
сообщение Apr 5 2006, 08:16
Сообщение #12


Знающий
****

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



Я делал на основе знакопостоянного CORDIC'a там можно обойтись сдвижкой сложением /вычитанием и небольшой памятью (например для 32 разрядов нужно было 32 ячейки)
Go to the top of the page
 
+Quote Post
Rst7
сообщение Apr 5 2006, 09:27
Сообщение #13


Йа моск ;)
******

Группа: Модераторы
Сообщений: 4 345
Регистрация: 7-07-05
Из: Kharkiv-city
Пользователь №: 6 610



А при чем тут CORDIC (быстрый поворот вектора) к логарифму?


--------------------
"Практика выше (теоретического) познания, ибо она имеет не только достоинство всеобщности, но и непосредственной действительности." - В.И. Ленин
Go to the top of the page
 
+Quote Post
vitus_strom
сообщение Apr 5 2006, 11:09
Сообщение #14


Знающий
****

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



при том что это семейство алгоритмов, в которое входит и вычисление логарифмма, только для тригинометрии используют знакопеременной ряд, а тут нужен знакопостоянный
Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 10th July 2025 - 11:27
Рейтинг@Mail.ru


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