Программирование игр, создание игрового движка, OpenGL, DirectX, физика, форум
GameDev.ru / Программирование / Подсказки / Одновременное вычисление sin(a) и cos(a)

Одновременное вычисление sin(a) и cos(a)

Автор:

Если необходимо посчитать одновременно синус и косинус некоторого угла (например, при построении матрицы вращения), быстрее будет вызвать функцию sincos, вместо того чтобы вызывать sin и cos по отдельности:

void sincos(float a, float &s, float &c) 
{ 
  _asm
  { 
    fld a
    fsincos
    fstp dword ptr [c]
    fstp dword ptr [s]
  }
}

12 октября 2009

#математика


Обновление: 14 октября 2009

Комментарии:
Страницы: 1 2 Следующая »
boolПостоялецwww14 окт. 200912:51#1
void sincos(float a, float &s, float &c) 
{ 
  _asm
  { 
    fld a
    fsincos
    fstp dword ptr [c]
    fstp dword ptr [s]
  }
}

в коде подсказки ошибка, fstp  dword ptr [edx] -> fstp  dword ptr [ebx]

Правка: 14 окт. 2009 12:54

my.nameПостоялецwww14 окт. 200915:38#2
я думаю о таком должен догадаться компилятор
boolПостоялецwww14 окт. 200917:25#3
my.name
компилятор не догадался об ошибке edx / ebx, и программа вылетала из-за того, что переменные передаются в eax/ebx, а берутся из eax/edx
NikopolМодераторwww14 окт. 200917:37#4
bool
Подправил.
my.nameПостоялецwww15 окт. 20091:26#5
я имел ввиду компилятор должен был бы догадаться, что один и тот же константный угол, мы в одном методе используем для получения и сунуса и косинуса. и подставить такой вариант решения.
NikopolМодераторwww15 окт. 20093:03#6
my.name
Так это проверить просто.
Напиши три строчки кода, да скомпилируй.
serpinfПостоялецwww15 окт. 20098:27#7
my.name
Ну кстати в хедерах физикса есть именно такой код (ну то есть ту же идею использует), так что наверное есть смысл какой-то
boolПостоялецwww15 окт. 200911:07#8
смысл есть, на 100 000 итераций sincos выиграла у sinf + cosf ~11 тиков на P4 2.4ghz
IskanderУдалёнwww15 окт. 200912:15#9
jaxon
my.name
Возможно еще и такое - компилятор может догадаться. (а может и нет) Здесь он гарантированно сделает так.
destratorУдалёнwww15 окт. 200912:16#10
> смысл есть, на 100 000 итераций sincos выиграла у sinf + cosf ~11 тиков на P4 2.4ghz
КРУТО!!!
сори за офтоп
GordonПостоялецwww15 окт. 200912:34#11
bool
Сори, tip добавлял тысячу лет назад, возможно поэтому остались такие ляпы:)
AliorПостоялецwww1 июня 20118:09#12
Синус с достаточной точность можно вычислить вообще sin(x)=x-((x^3)/6)
Причем x>=0 и x<=1.57
Но так можно вычислить углы только до 90 градусов)
Если хочется дальше надо продолжать ряд Тейлора)
Но добавив пару евристик можно найти синус любого угла)
С косинусами почти тоже самое :)

Правка: 1 июня 2011 8:25

asvpПостоялецwww1 июня 201122:15#13
AMDmi3Постоялецwww2 июня 201118:26#14
Для полноты картины:

sincos(3) - Linux man page
Name
sincos, sincosf, sincosl - calculate sin and cos simultaneously

Страницы: 1 2 Следующая »

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

2001—2017 © GameDev.ru — Разработка игр