ПрограммированиеФорумОбщее

Получение приближенных значений тригонометрических функций быстро. (комментарии)

Страницы: 1 2 3 Следующая »
#0
9:56, 10 июня 2009

Получение приближенных значений тригонометрических функций быстро. (комментарии)

Это сообщение сгенерировано автоматически.

#1
9:56, 10 июня 2009

А как же кеш?
Сейчас разве не быстрее будет с такой же точностью посчитать приближенное значение полиномом?

Кстати, код

float alpha=95.5;
float x=_sin[(int)alpha)];

далёк от реальности.
чаще будет что-то вроде

float alpha=-995.5;
float x=_sin[int(alpha + 360000.5f) % 360];

Чтобы избавиться от медленного "%" можно сделать не 360, а 256 делений.

float alpha=-995.5;
float x=_sin[floor(alpha + 0.5f) & 255];
#2
10:03, 10 июня 2009

Этот метод стар, как дедушкин автомобиль, сейчас быстрее расчитать на процессоре!

#3
10:25, 10 июня 2009

remal
У тебя есть тесты, говорящие в пользу твоего вывода?
В любом случае, табличная выборка страдает погрешностями, приемлемыми в одних случаях, и неприемлемыми в других.

#4
11:54, 10 июня 2009

remal
> Этот метод стар, как дедушкин автомобиль, сейчас быстрее расчитать на процессоре!
На сколько я знаю, быстрее получится либо при о-oчень малой точности либо при расчетах в потоке с использованиеа SSE.

В собственно коде:

float x=_sin[(int)alpha)];

есть очень нехорошее приведение float к int, которое, если не применять дополнительных мер, достаточно тормозно.
Если учесть представление формата float то можно обойтись без явного приведения. Правда, в этом случае, шаг таблицы будет неравномерный.

#5
16:08, 10 июня 2009

Святые суслики, not this shit again!

господа, просто используйте sincos или sincos128 да возрадуйтесь скорости и точности, не надо телепать этот трупик палочкой =(

#6
17:44, 10 июня 2009

Suslik
> господа, просто используйте sincos или sincos128 да возрадуйтесь скорости и точности
http://gruntthepeon.free.fr/ssemath/

#7
18:10, 10 июня 2009

Для стандартных тригонометрических функций такая "оптимизация" неактуальна лет восемь. Что не мешает применить её к каким-нибудь юзерским сложным функциям. :)

#8
21:00, 10 июня 2009

Вот это круто!!!
Эту "подсказку" я написал года 3 назад, если не больше!
Сегодня сильно удивился, увидев у себя мыло, о том, что она принята!

#9
16:05, 14 июня 2009

Suslik+1. Тестировал в своё время lookup-таблицы для тригонометрических функций. Не стоят они того.

#10
13:34, 18 июня 2009

Dexus
угу...

#11
13:39, 18 июня 2009

И только кот понял, в чём тут дело. Но никто его не услышал;)

#12
13:53, 18 июня 2009

По оптимизации математических функций есть весёлая дока:
http://www.research.scea.com/gdc2003/fast-math-functions_p1.pdf
http://www.research.scea.com/gdc2003/fast-math-functions_p2.pdf

#13
14:03, 18 июня 2009

у меня примерно вот такая штука:

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
struct SinCosHelper
{
  float sinTable1[256];
  float sinTable2[256];
  float cosTable1[256];
  float cosTable2[256];
  
  SinCosHelper();
};
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
SinCosHelper::SinCosHelper()
{
  for( uint16 i = 0; i < 256; ++i )
  {
    sinTable1[i] = Sin( FromUINT16ToRad( i * 256 ) );
    cosTable1[i] = Cos( FromUINT16ToRad( i * 256 ) );
    sinTable2[i] = Sin( FromUINT16ToRad( i ) );
    cosTable2[i] = Cos( FromUINT16ToRad( i ) );
  };
};
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
void inline SinCos( uint16 index, float &sinValue, float &cosValue )
{
  uint8 indHi = (uint8)  index;
  uint8 indLo = (uint8)( index >> 8 );
  
  float sin1 = sinCosHelper.sinTable1[ indLo ];
  float cos1 = sinCosHelper.cosTable1[ indLo ];
  float sin2 = sinCosHelper.sinTable2[ indHi ];
  float cos2 = sinCosHelper.cosTable2[ indHi ];

  sinValue = sin1 * cos2 + cos1 * sin2;
  cosValue = cos1 * cos2 - sin1 * sin2;

};

Оно специально для анимаций, где углы Эйлера хранятся в 16 битах. Для абсолютно точной таблицы. В general быстрой тригонометрии смысла особого не вижу.

#14
15:03, 18 июня 2009

NULL_PTR
спасибо за ссылки

Страницы: 1 2 3 Следующая »
ПрограммированиеФорумОбщее

Тема в архиве.