Funkce sin() a cos() a další trigonometrické funkce nejsou v jazyce SDS-C definovány, ale to neznamená že je nelze použít - napište si je sám. Aktuálně je to velmi jednoduché vzhledem ke skutečným požadavkům vaší aplikace.
Stačí vyhledet "sin approximation" a návodů je celá řada.
Mi se líbí tento: http://www.coranac.com/2009/07/sines/ - proto sem do příspěvku přepíšu jednu z uvedených funkcí.
Protože používá datový typ "s32" (signed 32 bit) což je to samé co interně používá SDS-C.
No a kosinus je ve výsledku to samé co sinus, ale s fázovým posunem (tj. výsledky pro kosinus dostaneme i z funkce sinus, stačí jen poskytnou funkci sinus vstupní parametr s přičtenou konstantou). Takže stačí implementovat jen aproximaci funkce sin() a je to, zbytek (vše) je středoškolská matematika.
var sin_input;
var sin_output;
isin_S4
{
// copyright by http://www.coranac.com/2009/07/sines/
var x;
var c, x2, y;
var qN, qA, B, C;
x = sin_input;
qN= 13; qA= 12; B=19900; C=3516;
c= x<<(30-qN); // Semi-circle info into carry.
x -= 1<<qN; // sine -> cosine calc
x= x<<(31-qN); // Mask with PI
x= x>>(31-qN); // Note: SIGNED shift! (to qN)
x= x*x>>(2*qN-14); // x=x^2 To Q14
y= B - (x*C>>14); // B - x^2*C
y= (1<<qA)-(x*y>>16); // A - x^2*(B-x^2*C)
if (c >= 0)
{
sin_output = y;
} else
{
sin_output = 0 - y;
}
}
main
{
sin_input = 1;
isin_S4();
echo(' vysledek = ', sin_output);
x: goto x;
}
Správný rozsah vstupních hodnot a správnou interpretaci výstupní hodnot si už zjistěte sami, viz odkaz.
Základem je hodnota PI a to je 0x4000 (16384 decimálně). Zdejší funkce isin_S4() samozřejmě pracuje s radiány, ne se stupni.
Pak platí následující příklad: sin_input = -224385 -> -13.6954*pi = -43.0253 rad -> 0x1000*sin(-43.0253) = 3348 kde sin_output = 3353 což je velm blízko. Takže to i funguje, zdá se.
Pochlubte se - popište jak využíváte své zařízení SDS zde ! Můžete si bezplatně přidat svou reklamu !