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
FSINCOSche li calcola entrambi (quasi nello stesso tempo di una chiamata aFSINsolo)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
sincosesincosfsono probabilmente disponibili e possono essere chiamate direttamente includendo semplicementemath.hL' 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
sincosa 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/6e cosx~1-x^2/4come 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 ntempi. 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.
xvicini a un certo punto x_0, quindi espandi la tua serie di Taylor intorno x_0invece di 0. Questo ti darà un'eccellente precisione vicino x_0ma 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.