Saya ingin memperluas jawaban yang diberikan oleh @Jason S. Menggunakan metode subdivisi domain yang mirip dengan yang dijelaskan oleh @Jason S dan menggunakan pendekatan seri Maclaurin, kecepatan rata-rata (2-3) X di atas tan (), sin () , cos (), atan (), asin (), dan acos () fungsi yang dibangun ke dalam kompiler gcc dengan -O3 optimasi tercapai. Fungsi pendekatan seri Maclaurin terbaik yang dijelaskan di bawah ini mencapai akurasi presisi ganda.
Untuk fungsi tan (), sin (), dan cos (), dan untuk kesederhanaan, domain 0 hingga 2pi + pi / 80 yang tumpang tindih dibagi menjadi 81 interval yang sama dengan "titik jangkar" pada pi / 80, 3pi / 80, ..., 161pi / 80. Kemudian tan (), sin (), dan cos () dari 81 titik jangkar ini dievaluasi dan disimpan. Dengan bantuan identitas trigonometri, satu fungsi deret Maclaurin dikembangkan untuk setiap fungsi trigonometri. Setiap sudut antara ± tak terhingga dapat dikirimkan ke fungsi perkiraan trigonometri karena fungsi pertama menerjemahkan sudut masukan ke domain 0 hingga 2pi. Overhead terjemahan ini termasuk dalam overhead aproksimasi.
Metode serupa dikembangkan untuk fungsi atan (), asin (), dan acos (), di mana domain -1.0 hingga 1.1 yang tumpang tindih dibagi menjadi 21 interval yang sama dengan titik jangkar pada -19/20, -17/20, .. ., 19/20, 21/20. Kemudian hanya atan () dari 21 titik jangkar ini yang disimpan. Sekali lagi, dengan bantuan identitas trigonometri terbalik, satu fungsi deret Maclaurin dikembangkan untuk fungsi atan (). Hasil dari fungsi atan () kemudian digunakan untuk mendekati asin () dan acos ().
Karena semua fungsi pendekatan trigonometri terbalik didasarkan pada fungsi perkiraan atan (), nilai masukan argumen presisi ganda apa pun diperbolehkan. Namun masukan argumen ke fungsi pendekatan asin () dan acos () dipotong ke domain ± 1 karena nilai apa pun di luarnya tidak berarti.
Untuk menguji fungsi yang mendekati, satu miliar evaluasi fungsi acak dipaksa untuk dievaluasi (yaitu, compiler pengoptimalan -O3 tidak diizinkan untuk melewati evaluasi sesuatu karena beberapa hasil yang dihitung tidak akan digunakan.) Untuk menghilangkan bias dalam mengevaluasi satu miliar bilangan acak dan memproses hasilnya, biaya menjalankan tanpa mengevaluasi fungsi trigonometri atau inversi dilakukan terlebih dahulu. Bias ini kemudian dikurangkan dari setiap pengujian untuk mendapatkan perkiraan waktu evaluasi fungsi yang lebih representatif.
Tabel 2. Waktu yang dihabiskan dalam hitungan detik untuk menjalankan fungsi atau fungsi yang ditunjukkan satu miliar kali. Estimasi diperoleh dengan mengurangi biaya waktu untuk mengevaluasi satu miliar bilangan acak yang ditunjukkan pada baris pertama Tabel 1 dari baris yang tersisa pada Tabel 1.
Waktu yang dihabiskan di tan (): 18.0515 18.2545
Waktu yang dihabiskan di TAN3 (): 5.93853 6.02349
Waktu yang dihabiskan di TAN4 (): 6.72216 6.99134
Waktu yang dihabiskan dalam sin () dan cos (): 19.4052 19.4311
Waktu yang dihabiskan di SINCOS3 (): 7.85564 7.92844
Waktu yang dihabiskan di SINCOS4 (): 9.36672 9.57946
Waktu yang dihabiskan di atan (): 15.7160 15.6599
Waktu yang dihabiskan di ATAN1 (): 6.47800 6.55230
Waktu yang dihabiskan di ATAN2 (): 7.26730 7.24885
Waktu yang dihabiskan di ATAN3 (): 8.15299 8.21284
Waktu yang dihabiskan di asin () dan acos (): 36.8833 36.9496
Waktu yang dihabiskan di ASINCOS1 (): 10.1655 9.78479
Waktu yang dihabiskan di ASINCOS2 (): 10.6236 10.6000
Waktu yang dihabiskan di ASINCOS3 (): 12.8430 12.0707
(Demi menghemat ruang, Tabel 1 tidak diperlihatkan.) Tabel 2 menunjukkan hasil dari dua proses terpisah dari satu miliar evaluasi dari setiap fungsi perkiraan. Kolom pertama adalah proses pertama dan kolom kedua adalah proses kedua. Angka '1', '2', '3' atau '4' pada nama fungsi menunjukkan jumlah istilah yang digunakan dalam fungsi deret Maclaurin untuk mengevaluasi perkiraan trigonometri atau inversi trigonometri tertentu. SINCOS # () berarti bahwa sin dan cos dievaluasi pada waktu yang sama. Demikian juga, ASINCOS # () berarti asin dan acos dievaluasi pada waktu yang sama. Ada sedikit biaya tambahan dalam mengevaluasi kedua kuantitas secara bersamaan.
Hasilnya menunjukkan bahwa peningkatan jumlah persyaratan sedikit meningkatkan waktu eksekusi seperti yang diharapkan. Bahkan jumlah suku terkecil memberikan akurasi sekitar 12-14 digit di mana-mana kecuali untuk perkiraan tan () di dekat dimana nilainya mendekati ± tak terhingga. Orang akan berharap bahkan fungsi tan () memiliki masalah di sana.
Hasil serupa diperoleh pada laptop MacBook Pro kelas atas di Unix dan pada komputer desktop kelas atas di Linux.