Vorrei calcolare insieme sia il seno che il co-seno di un valore (ad esempio per creare una matrice di rotazione). Ovviamente potrei calcolarli separatamente uno dopo l'altro come a = cos(x); b = sin(x);
, ma mi chiedo se esista un modo più veloce quando sono necessari entrambi i valori.
Modifica: per riassumere le risposte finora:
Vlad ha detto che c'è il comando asm
FSINCOS
che li calcola entrambi (quasi nello stesso tempo di una chiamata aFSIN
solo)Come ha notato Chi , questa ottimizzazione a volte è già eseguita dal compilatore (quando si utilizzano i flag di ottimizzazione).
caf ha sottolineato che le funzioni
sincos
esincosf
sono probabilmente disponibili e possono essere chiamate direttamente includendo semplicementemath.h
L' approccio tanascius di utilizzare una tabella di ricerca è discusso controverso. (Tuttavia sul mio computer e in uno scenario di benchmark funziona 3 volte più velocemente rispetto
sincos
a quasi la stessa precisione per i punti mobili a 32 bit.)Joel Goodwin si è collegato a un approccio interessante di una tecnica di approssimazione estremamente veloce con una precisione abbastanza buona (per me, questo è ancora più veloce della ricerca nella tabella)
sinx ~ x-x^3/6
e cosx~1-x^2/4
come approssimazioni se ti interessa la velocità più che la precisione. Puoi aggiungere termini in entrambe le serie man mano che dai più peso alla precisione ( en.wikipedia.org/wiki/Taylor_series scorri verso il basso fino a trig taylor series.) Nota che questo è un modo generale per approssimare qualsiasi funzione tu voglia che sia differenziata in n
tempi. Quindi, se hai una funzione più grande a cui appartengono quel seno e quel coseno, otterrai una velocità molto maggiore se la approssimerai invece del peccato, cos è indipendentemente.
x
vicini a un certo punto x_0
, quindi espandi la tua serie di Taylor intorno x_0
invece di 0. Questo ti darà un'eccellente precisione vicino x_0
ma più lontano peggiorano i risultati. Probabilmente hai pensato che l'accuratezza facesse schifo perché hai guardato la risposta data e l'hai provata per valori lontani da 0
. La risposta è con il peccato, che si è espanso intorno allo 0.