|
Как реализованы функции cos(x) exp(x) в math.h ? |
|
|
|
 |
Ответов
|
Jan 29 2010, 19:48
|

Частый гость
 
Группа: Свой
Сообщений: 118
Регистрация: 24-05-08
Из: Odessa
Пользователь №: 37 784

|
Цитата(Serj78 @ Jan 28 2010, 20:48)  Библиотека math.h, входящая в состав кейла, по- видимому также использует ряд Тейлора. Причем количество членов воидимо какое-то ужасное, судя по времени выполнения. На AVR из его библиотеки float sin(float x) выполнялся впятеро быстрее, там было 5 членов ряда. Буду переписывать библиотеку- по времени выполнения математика меня не устраивает - медленнее чем на 8-ми битнике (AVR) работает при вчетверо большей тактовой. А уж знаменито разрекламированная функция (hypot) вычисляющая длину двумерного вектора ( например, модуль комплексного числа ), это вообще песня. 0.76 мс!!! на 72-х мегагерцах... Тоже столкнулся с проблемой очень медленной работы функций. Код tab_sin_U[i]=round((sin(temp)*amount)+(1/6)*(sin(3*temp)*amount)); Расчет массива из 1024-х значений по этой формуле, в STR912 занимал примерно пол секунды. И это при частоте ядра 96МГц.
Сообщение отредактировал artur_off - Jan 29 2010, 20:05
--------------------
Big time.
|
|
|
|
|
Jan 30 2010, 20:02
|
Гуру
     
Группа: Свой
Сообщений: 3 020
Регистрация: 7-02-07
Пользователь №: 25 136

|
Цитата(artur_off @ Jan 29 2010, 22:48)  Тоже столкнулся с проблемой очень медленной работы функций. Код tab_sin_U[i]=round((sin(temp)*amount)+(1/6)*(sin(3*temp)*amount)); Расчет массива из 1024-х значений по этой формуле, в STR912 занимал примерно пол секунды. И это при частоте ядра 96МГц. Формула как-то странно выглядит. Например, (1/6) - это 0. Возможно, что с типами других операндов напутано. Если можно не использовать double, то нужно внимательно проследить, чтобы везде был float. К тому же amount можно вынести за скобки и сэкономить одно умножение. Что делает round() и как - непонятно. Вывод: рано спешить с выводами про "быстро-медленно", сначала надо код подправить. И вообще, что такое "очень медленная работа функций, и это с частотой ядра 96 МГц"? Эта фраза не имеет смысла, пока не сказано, сколько микросекунд - медленно, а сколько - быстро.
|
|
|
|
|
Jan 31 2010, 12:29
|

Частый гость
 
Группа: Свой
Сообщений: 118
Регистрация: 24-05-08
Из: Odessa
Пользователь №: 37 784

|
Цитата(scifi @ Jan 30 2010, 22:02)  Формула как-то странно выглядит. Например, (1/6) - это 0. Возможно, что с типами других операндов напутано. Если можно не использовать double, то нужно внимательно проследить, чтобы везде был float. К тому же amount можно вынести за скобки и сэкономить одно умножение. Что делает round() и как - непонятно. Вывод: рано спешить с выводами про "быстро-медленно", сначала надо код подправить. И вообще, что такое "очень медленная работа функций, и это с частотой ядра 96 МГц"? Эта фраза не имеет смысла, пока не сказано, сколько микросекунд - медленно, а сколько - быстро. Это кусок кода с матлаба, так как сишный удалил. а на С естественно было приведение к float. хотя здесь протупил, вместо 1/6 можно было написать 0.167. round() - математическое округление. по поводу amount согласен, но это не так уж и сильно влияет на производительность. По поводу времени выполнения было сказано, что занимает примерно пол секунды (0.5 с).
Сообщение отредактировал artur_off - Jan 31 2010, 12:45
--------------------
Big time.
|
|
|
|
|
Jan 31 2010, 13:45
|
Гуру
     
Группа: Свой
Сообщений: 3 020
Регистрация: 7-02-07
Пользователь №: 25 136

|
Цитата(artur_off @ Jan 31 2010, 15:29)  Это кусок кода с матлаба, так как сишный удалил. а на С естественно было приведение к float. хотя здесь протупил, вместо 1/6 можно было написать 0.167. round() - математическое округление. Если везде float, то нужно использовать sinf() вместо sin(), roundf() вместо round(). 0.167 лучше писать как 0.167f, а если округление до трёх цифр не подходит, то 1.0f/6. Не сочтите за занудство, это на всякий случай. Скорее всего, у Вас так и написано. Меня удивил round(), потому что в стандартной библиотеке Си его сразу не нашёл. Видимо, было добавлено в C99...
|
|
|
|
|
Jan 31 2010, 17:26
|

Частый гость
 
Группа: Свой
Сообщений: 118
Регистрация: 24-05-08
Из: Odessa
Пользователь №: 37 784

|
Цитата(scifi @ Jan 31 2010, 15:45)  Если везде float, то нужно использовать sinf() вместо sin(), roundf() вместо round(). 0.167 лучше писать как 0.167f, а если округление до трёх цифр не подходит, то 1.0f/6. Не сочтите за занудство, это на всякий случай. Скорее всего, у Вас так и написано. Меня удивил round(), потому что в стандартной библиотеке Си его сразу не нашёл. Видимо, было добавлено в C99... Благодарю за советы))). А round() действительно добавлен в С99 и поэтому перед #include <math.h> надо объявить #define __USE_C99_MATH.
--------------------
Big time.
|
|
|
|
Сообщений в этой теме
Костян Как реализованы функции cos(x) exp(x) в math.h ? Jan 28 2010, 07:29 scifi Можно подглядеть у newlib.
Вот синус-косинус:
sf_s... Jan 28 2010, 07:55 kosyak© Скорее всего ряд Тейлора. Jan 28 2010, 08:03 _Pasha Цитата(kosyak© @ Jan 28 2010, 11:03) Скор... Jan 28 2010, 10:11 blackfin CORDIC Jan 28 2010, 18:54 _Pasha Цитата(blackfin @ Jan 28 2010, 21:54) COR... Jan 28 2010, 22:45 Drozd2 Если есть желание реализовать свой алгоритм, тогда... Jan 30 2010, 23:23 Serj78 Цитата(Drozd2 @ Jan 31 2010, 02:23) Если ... Jan 31 2010, 10:35  scifi Цитата(Serj78 @ Jan 31 2010, 13:35) Возмо... Jan 31 2010, 11:40   _Pasha Цитата(scifi @ Jan 31 2010, 15:40) Если ч... Feb 1 2010, 00:03
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|