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

Логарифм

Помогите пожалуста можно ли зашить в МК, и в какой, вычисление десятичного логарифма? Заранее благодарен.

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


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

Да в любой можно запихать ;)

вопрос в точности и скорости

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


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

Насколько помню из математики логарифм через ряд вычеслялся, то есть тебе нужно будет циклически умножать, делить и складывать, причем точность зависит от числа операций и соответственно времени вычесления. Да и еще если хочешь все это дело побыстрее то нужен контроллер как минимум с аппаратным умножением, а лучше и с аппаратным делением и с MAC(multiply accomulate) инструкциями. То биш на DSP лучше делать если скорость и точность нужна.

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


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

Помогите пожалуста можно ли зашить в МК, и в какой, вычисление десятичного логарифма? Заранее благодарен.

 

В библиотеках С-компилеров просто должна быть

готовая функция.

:P

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


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

Помогите пожалуста можно ли зашить в МК, и в какой, вычисление десятичного логарифма? Заранее благодарен.

 

В библиотеках С-компилеров просто должна быть

готовая функция.

:P

Ага...только при использовании этой функции флэш забивается чуть ли не на половину (У меги 8535)!!! Я уже молчу о времени выполнения данной функции.....быстрее было бы на калькуляторе просчитать :blink:

Так что советую два выхода:

- либо численные методы, как было сказано выше.

- либо ставь сопроцессор, который бы тебе считал логарифм, сооствественно с вытекающими последствиями

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


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

Ага...только при использовании этой функции флэш забивается чуть ли не на половину (У меги 8535)!!! Я уже молчу о времени выполнения данной функции.....быстрее было бы на калькуляторе просчитать :blink:

Так что советую два выхода:

- либо численные методы, как было сказано выше.

- либо ставь сопроцессор, который бы тебе считал логарифм, сооствественно с вытекающими последствиями

 

Что-то не сходится.. Ну не может функция расчета логарифма занимать пол-флеша у mega8535. Одно из двух либо она будет работать очень быстро (если столько памяти занимает) либо вы что-то преврали.

В общем стандартное решение:

#include <math.h>

 

y = log10(x);

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


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

Флеш забивается потому что ты используеш всю библиотеку math.h проше вытащить из нее вычисление логарифма и вставить в программу. Ну а по поводу времени вычисления можно посчитать это время, а мож человеко оно и нормально подойдет.

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


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

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

Вообще-то линкер должен брать только используемые функции, а не всю библиотеку :).

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


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

Что-то не сходится.. Ну не может функция расчета логарифма занимать пол-флеша у 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);

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


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

А вот для десятичного логарифма и к тому-же работаяющая гораздо быстрее.

Для достаточно больших 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;

}

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


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

Я делал на основе знакопостоянного CORDIC'a там можно обойтись сдвижкой сложением /вычитанием и небольшой памятью (например для 32 разрядов нужно было 32 ячейки)

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


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

при том что это семейство алгоритмов, в которое входит и вычисление логарифмма, только для тригинометрии используют знакопеременной ряд, а тут нужен знакопостоянный

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


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

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

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

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

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

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

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

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

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

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