2012-02-13 19 views
6

Sto cercando di implementare le funzioni coseno e seno in virgola mobile (ma non ho hardware in virgola mobile).Coseno in virgola mobile

Poiché il mio processore non ha hardware in virgola mobile, né istruzioni, ho già implementato algoritmi per la moltiplicazione in virgola mobile, la divisione, l'addizione, la sottrazione e la radice quadrata. Quindi quelli sono gli strumenti che ho a disposizione per implementare il coseno e il seno.

ero valutando con il metodo CORDIC, at this site Tuttavia, attuato divisione e radice quadrata metodo di Newton, quindi speravo di usare il metodo più efficiente.

Per favore non dirmi di andare a cercare in un libro o che esistono "fogli di carta", non esistono scherzi. Sto cercando i nomi di algoritmi noti che sono noti per essere veloci ed efficienti.

+1

Non riesci a trovare e adattare una libreria matematica esistente? Perché la matematica sotto di loro è abbastanza complessa! Scrivere una biblioteca matematica competitiva potrebbe valerne un dottorato (e richiederebbe anni di sforzi). –

+0

Non sono un vero drogato di codice, mi piacerebbe solo l'algoritmo e posso fare l'implementazione da solo. Devo riscrivere il codice in assembly da solo e poi pianificarlo. (È per un processore personalizzato). – Veridian

+0

Credo che ci siano molti libri e articoli su questo argomento. Sei entrato in una biblioteca universitaria? –

risposta

4

Prima di tutto, a seconda dei requisiti di precisione, questo può essere molto più faticoso delle precedenti domande.

Ora che sei stato avvisato: dovrai prima ridurre l'argomento modulo pi/2 (o 2pi, o pi, o pi/4) per ottenere l'input in un intervallo gestibile. Questa è la parte sottile. Per una bella discussione dei problemi coinvolti, scarica una copia di K.C. Ng's ARGOMENTO RIDUZIONE PER ARGOMENTI ENORMI: Buono fino all'ultimo bit. (semplice ricerca su google sul titolo ti darà un pdf). È molto leggibile e fa un ottimo lavoro nel descrivere perché questo è complicato.

Dopo aver fatto ciò, è sufficiente approssimare le funzioni su un piccolo intervallo intorno allo zero, operazione che può essere facilmente eseguita tramite un'approssimazione polinomiale. Una serie di Taylor funzionerà, sebbene sia inefficiente. Una serie troncata di chebyshev è facile da calcolare e ragionevolmente efficiente; calcolare l'approssimazione minimax è ancora meglio. Questa è la parte facile.

Ho implementato seno e coseno esattamente come descritto, interamente in intero, nel passato (mi dispiace, nessuna fonte pubblica). Usando l'assemblaggio manuale, i risultati nell'arco di 100 cicli sono del tutto ragionevoli per i processori "tipici". Non so con quale hardware hai a che fare (le prestazioni saranno per lo più controllate da quanto velocemente il tuo hardware può produrre la parte alta di un multiplo intero).

+0

@starbox: l'approssimazione minimax è qualcosa di un'arte nera. lo sai solo se hai bisogno di usarlo. È possibile iniziare guardando l'algoritmo di scambio Remez, che è un approccio standard. Una serie troncata di Chebyshev è molto più facile da calcolare e quasi altrettanto valida. Una serie di Taylor richiederà alcuni termini in più per offrire la stessa accuratezza, ma è (ovviamente) molto semplice. –

+0

@starbox: dovrei anche notare che probabilmente * non * vorrà utilizzare le tue attuali routine di addizione e moltiplicazione FP (che è troppo costoso). Mantenere la maggior parte del calcolo nel numero intero risulta essere più semplice in qualche modo, comunque. Il processore con cui ho scritto l'implementazione per interi aveva effettivamente una FPU, ma ero in grado di ottenere il risultato più velocemente senza usarlo. –

+1

@starbox: il motivo per evitare l'utilizzo di operazioni FP complete è che non è necessario aggirare tutti i passaggi del calcolo. Puoi portare un po 'di precisione in più e ritardare qualsiasi logica di arrotondamento fino alla fine. –

-1

Dato che le operazioni aritmetiche di base sono state implementate, è possibile implementare il seno e il coseno utilizzando le espansioni della serie taylor.

+0

So che potrei farlo, ma voglio un metodo che sia il più efficiente e veloce. So che alcuni metodi usano una tabella di ricerca, quali sono quelli e sono molto più veloci? – Veridian

+0

e approssimazione minimax? – Veridian

+0

scusate, non ho familiarità con gli algoritmi minimix – ardnew

1

Per vari livelli di precisione, si possono trovare alcune buone approssimazioni qui:

http://www.ganssle.com/approx.htm

Con il vantaggio che essi sono deterministiche in runtime a differenza delle varie opzioni di "serie convergenti" che può variare molto a seconda sul valore di input. Questo è importante se stai facendo qualcosa in tempo reale (giochi, controllo del movimento ecc.)