vov136 0 31 августа, 2004 Опубликовано 31 августа, 2004 · Жалоба Помогите пожалуста можно ли зашить в МК, и в какой, вычисление десятичного логарифма? Заранее благодарен. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
KRS 1 31 августа, 2004 Опубликовано 31 августа, 2004 · Жалоба Да в любой можно запихать ;) вопрос в точности и скорости Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Himer 0 31 августа, 2004 Опубликовано 31 августа, 2004 · Жалоба Насколько помню из математики логарифм через ряд вычеслялся, то есть тебе нужно будет циклически умножать, делить и складывать, причем точность зависит от числа операций и соответственно времени вычесления. Да и еще если хочешь все это дело побыстрее то нужен контроллер как минимум с аппаратным умножением, а лучше и с аппаратным делением и с MAC(multiply accomulate) инструкциями. То биш на DSP лучше делать если скорость и точность нужна. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Kot 0 24 сентября, 2004 Опубликовано 24 сентября, 2004 · Жалоба Если много лишней :) памяти и мало времени - табличный метод рулит. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
-Tумблер- 0 5 ноября, 2004 Опубликовано 5 ноября, 2004 · Жалоба Помогите пожалуста можно ли зашить в МК, и в какой, вычисление десятичного логарифма? Заранее благодарен. В библиотеках С-компилеров просто должна быть готовая функция. :P Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Starick 0 30 марта, 2006 Опубликовано 30 марта, 2006 · Жалоба Помогите пожалуста можно ли зашить в МК, и в какой, вычисление десятичного логарифма? Заранее благодарен. В библиотеках С-компилеров просто должна быть готовая функция. :P Ага...только при использовании этой функции флэш забивается чуть ли не на половину (У меги 8535)!!! Я уже молчу о времени выполнения данной функции.....быстрее было бы на калькуляторе просчитать :blink: Так что советую два выхода: - либо численные методы, как было сказано выше. - либо ставь сопроцессор, который бы тебе считал логарифм, сооствественно с вытекающими последствиями Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
defunct 0 31 марта, 2006 Опубликовано 31 марта, 2006 · Жалоба Ага...только при использовании этой функции флэш забивается чуть ли не на половину (У меги 8535)!!! Я уже молчу о времени выполнения данной функции.....быстрее было бы на калькуляторе просчитать :blink: Так что советую два выхода: - либо численные методы, как было сказано выше. - либо ставь сопроцессор, который бы тебе считал логарифм, сооствественно с вытекающими последствиями Что-то не сходится.. Ну не может функция расчета логарифма занимать пол-флеша у mega8535. Одно из двух либо она будет работать очень быстро (если столько памяти занимает) либо вы что-то преврали. В общем стандартное решение: #include <math.h> y = log10(x); Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
impuls-v 0 2 апреля, 2006 Опубликовано 2 апреля, 2006 · Жалоба Флеш забивается потому что ты используеш всю библиотеку math.h проше вытащить из нее вычисление логарифма и вставить в программу. Ну а по поводу времени вычисления можно посчитать это время, а мож человеко оно и нормально подойдет. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
AndyBig 8 2 апреля, 2006 Опубликовано 2 апреля, 2006 · Жалоба Флеш забивается потому что ты используеш всю библиотеку math.h Вообще-то линкер должен брать только используемые функции, а не всю библиотеку :). Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Chemtechnik 0 2 апреля, 2006 Опубликовано 2 апреля, 2006 · Жалоба Что-то не сходится.. Ну не может функция расчета логарифма занимать пол-флеша у 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); Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Chemtechnik 0 4 апреля, 2006 Опубликовано 4 апреля, 2006 · Жалоба А вот для десятичного логарифма и к тому-же работаяющая гораздо быстрее. Для достаточно больших 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; } Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
vitus_strom 0 5 апреля, 2006 Опубликовано 5 апреля, 2006 · Жалоба Я делал на основе знакопостоянного CORDIC'a там можно обойтись сдвижкой сложением /вычитанием и небольшой памятью (например для 32 разрядов нужно было 32 ячейки) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Rst7 5 5 апреля, 2006 Опубликовано 5 апреля, 2006 · Жалоба А при чем тут CORDIC (быстрый поворот вектора) к логарифму? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
vitus_strom 0 5 апреля, 2006 Опубликовано 5 апреля, 2006 · Жалоба при том что это семейство алгоритмов, в которое входит и вычисление логарифмма, только для тригинометрии используют знакопеременной ряд, а тут нужен знакопостоянный Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться