Saya ingin menghitung sinus dan co-sinus dari suatu nilai bersama-sama (misalnya untuk membuat matriks rotasi). Tentu saja saya dapat menghitungnya secara terpisah satu demi satu seperti a = cos(x); b = sin(x);
, tetapi saya bertanya-tanya apakah ada cara yang lebih cepat ketika membutuhkan kedua nilai tersebut.
Edit: Untuk meringkas jawaban sejauh ini:
Vlad berkata, bahwa ada perintah asm yang
FSINCOS
menghitung keduanya (dalam waktu yang hampir bersamaan dengan panggilan untukFSIN
sendiri)Seperti yang diperhatikan Chi , pengoptimalan ini terkadang sudah dilakukan oleh compiler (saat menggunakan flag pengoptimalan).
caf menunjukkan, bahwa fungsi
sincos
dansincosf
mungkin tersedia dan dapat dipanggil langsung dengan hanya memasukkanmath.h
Pendekatan tanascius menggunakan tabel look-up dibahas kontroversial. (Namun di komputer saya dan dalam skenario benchmark, ini berjalan 3x lebih cepat daripada
sincos
dengan akurasi yang hampir sama untuk floating point 32-bit.)Joel Goodwin ditautkan ke pendekatan menarik dari teknik pendekatan yang sangat cepat dengan akurasi yang cukup baik (bagi saya, ini bahkan lebih cepat daripada pencarian tabel)
sinx ~ x-x^3/6
dan cosx~1-x^2/4
sebagai perkiraan jika Anda lebih memperhatikan kecepatan daripada akurasi. Anda dapat menambahkan istilah di salah satu rangkaian saat Anda memberi bobot lebih pada keakuratan ( en.wikipedia.org/wiki/Taylor_series gulir ke bawah ke deret trig taylor.) Perhatikan bahwa ini adalah cara umum untuk memperkirakan fungsi apa pun yang Anda inginkan yaitu n
waktu yang dapat dibedakan . Jadi jika Anda memiliki beberapa fungsi yang lebih besar dari sinus dan cosinus itu, Anda akan mendapatkan kecepatan yang jauh lebih besar jika Anda memperkirakannya alih-alih sin, cos secara independen.
x
mendekati beberapa titik x_0
, kemudian perluas deret Taylor Anda sekitar x_0
bukannya 0. Ini akan memberi Anda akurasi yang sangat baik di dekat x_0
tetapi semakin jauh Anda semakin buruk hasilnya. Anda mungkin mengira keakuratan menyebalkan karena Anda melihat jawaban yang diberikan dan mencobanya untuk nilai yang jauh dari 0
. Jawabannya adalah dengan dosa, karena diperluas sekitar 0.