Войти
ПрограммированиеПодсказкиОбщееОбщее

Одновременное вычисление 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)

Комментарии [22]

Страницы: 1 2 Следующая »
#1
12:51, 14 окт. 2009
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]

#2
15:38, 14 окт. 2009

я думаю о таком должен догадаться компилятор

#3
17:25, 14 окт. 2009

my.name
компилятор не догадался об ошибке edx / ebx, и программа вылетала из-за того, что переменные передаются в eax/ebx, а берутся из eax/edx

#4
17:37, 14 окт. 2009

bool
Подправил.

#5
1:26, 15 окт. 2009

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

#6
3:03, 15 окт. 2009

my.name
Так это проверить просто.
Напиши три строчки кода, да скомпилируй.

#7
8:27, 15 окт. 2009

my.name
Ну кстати в хедерах физикса есть именно такой код (ну то есть ту же идею использует), так что наверное есть смысл какой-то

#8
11:07, 15 окт. 2009

смысл есть, на 100 000 итераций sincos выиграла у sinf + cosf ~11 тиков на P4 2.4ghz

#9
12:15, 15 окт. 2009

jaxon
my.name
Возможно еще и такое - компилятор может догадаться. (а может и нет) Здесь он гарантированно сделает так.

#10
12:16, 15 окт. 2009

> смысл есть, на 100 000 итераций sincos выиграла у sinf + cosf ~11 тиков на P4 2.4ghz
КРУТО!!!
сори за офтоп

#11
12:34, 15 окт. 2009

bool
Сори, tip добавлял тысячу лет назад, возможно поэтому остались такие ляпы:)

Прошло более 1 года
#12
8:09, 1 июня 2011

Синус с достаточной точность можно вычислить вообще sin(x)=x-((x^3)/6)
Причем x>=0 и x<=1.57
Но так можно вычислить углы только до 90 градусов)
Если хочется дальше надо продолжать ряд Тейлора)
Но добавив пару евристик можно найти синус любого угла)
С косинусами почти тоже самое :)

#13
22:15, 1 июня 2011

http://www.gamedev.ru/code/forum/?id=93064

#14
18:26, 2 июня 2011

Для полноты картины:

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

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

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