@ Jason S tarafından sağlanan yanıtı genişletmek istiyorum. @ Jason S tarafından tarif edilene benzer bir etki alanı alt bölümü yöntemi kullanarak ve Maclaurin serisi yaklaşımları kullanarak, tan (), sin () üzerinden ortalama (2-3) X hız artışı , cos (), atan (), asin () ve acos () fonksiyonları -O3 optimizasyonu ile gcc derleyicisine yerleştirildi. Aşağıda açıklanan en iyi Maclaurin serisi yaklaşık fonksiyonlar, iki kat kesinlik elde etti.
Tan (), sin () ve cos () fonksiyonları için ve basitlik için, örtüşen bir 0 ila 2pi + pi / 80 alanı, pi / 80, 3pi / 80'de "çapa noktaları" ile 81 eşit aralığa bölündü, ..., 161pi / 80. Sonra bu 81 bağlantı noktasından tan (), sin () ve cos () değerlendirildi ve saklandı. Trig kimlikleri yardımıyla, her bir trigonometrik fonksiyon için tek bir Maclaurin serisi fonksiyonu geliştirilmiştir. ± sonsuz arasındaki herhangi bir açı, tetik yaklaştırma fonksiyonlarına sunulabilir çünkü fonksiyonlar, ilk olarak giriş açısını 0 ila 2pi alanına çevirir. Bu çeviri ek yükü, tahmin ek yüküne dahil edilmiştir.
Atan (), asin () ve acos () fonksiyonları için benzer yöntemler geliştirildi; burada -1.0 ile 1.1 arasında örtüşen bir alan -19/20, -17/20, .. ., 19/20, 21/20. Daha sonra bu 21 bağlantı noktasından yalnızca bir tanesi () kaydedildi. Yine ters trigonometrik özdeşliklerin yardımıyla atan () işlevi için tek bir Maclaurin serisi işlevi geliştirilmiştir. Atan () fonksiyonunun sonuçları daha sonra asin () ve acos () 'ya yaklaşmak için kullanıldı.
Tüm ters tetikleme yaklaştırma işlevleri atan () yaklaştırma işlevine dayandığından, herhangi bir çift duyarlıklı bağımsız değişken girdi değerine izin verilir. Bununla birlikte, asin () ve acos () yaklaştırma işlevlerine argüman girdisi ± 1 alanına kesilir çünkü bunun dışındaki herhangi bir değer anlamsızdır.
Yaklaşık fonksiyonları test etmek için, bir milyar rastgele fonksiyon değerlendirmesinin değerlendirilmesi zorlandı (yani, -O3 optimizasyon derleyicisinin bir şeyi değerlendirmeyi atlamasına izin verilmedi çünkü bazı hesaplanmış sonuçlar kullanılmayacaktı.) rastgele sayılar ve sonuçların işlenmesi, herhangi bir trigonometrik veya ters trigonometrik fonksiyonu değerlendirmeden bir çalışmanın maliyeti ilk olarak gerçekleştirildi. Bu sapma daha sonra gerçek fonksiyon değerlendirme süresinin daha temsili bir yaklaşımı elde etmek için her testten çıkarıldı.
Tablo 2. Belirtilen işlevi veya işlevleri bir milyar kez yürütmek için saniye cinsinden harcanan süre. Tahminler, Tablo 1'in ilk satırında gösterilen bir milyar rasgele sayının değerlendirilmesinin zaman maliyeti Tablo 1'de kalan satırlardan çıkarılarak elde edilmiştir.
Bronzlaşmada geçirilen süre (): 18.0515 18.2545
TAN3 () içinde harcanan süre: 5.93853 6.02349
TAN4 () içinde harcanan süre: 6.72216 6.99134
Sin () ve cos () 'de harcanan süre: 19.4052 19.4311
SINCOS3'te () harcanan süre: 7.85564 7.92844
SINCOS4'te () harcanan süre: 9.36672 9.57946
Ata'da geçirilen süre (): 15.7160 15.6599
ATAN1'de () harcanan süre: 6.47800 6.55230
ATAN2'de () harcanan süre: 7.26730 7.24885
ATAN3 () içinde harcanan süre: 8.15299 8.21284
Asin () ve acos () 'da geçirilen süre: 36.8833 36.9496
ASINCOS1 () 'de geçirilen süre: 10.1655 9.78479
ASINCOS2'de () harcanan süre: 10.6236 10.6000
ASINCOS3 () 'de geçirilen süre: 12.8430 12.0707
(Yer tasarrufu sağlamak amacıyla, Tablo 1 gösterilmemiştir.) Tablo 2, her yaklaşık fonksiyonun bir milyar değerlendirmesinin iki ayrı çalışmasının sonuçlarını göstermektedir. İlk sütun, ilk sütun ve ikinci sütun ikinci işlemdir. İşlev adlarındaki '1', '2', '3' veya '4' sayıları, belirli trigonometri veya ters trigonometrik yaklaşımı değerlendirmek için Maclaurin serisi işlevinde kullanılan terimlerin sayısını gösterir. SINCOS # (), hem sin hem de cos'un aynı anda değerlendirildiği anlamına gelir. Aynı şekilde, ASINCOS # (), hem asin hem de acos'un aynı anda değerlendirildiği anlamına gelir. Her iki miktarın aynı anda değerlendirilmesinde çok az ek yük vardır.
Sonuçlar, terimlerin sayısının artırılmasının beklendiği gibi yürütme süresini biraz artırdığını göstermektedir. En küçük terim sayısı bile, değerinin ± sonsuza yaklaştığı yere yakın tan () yaklaşımı dışında her yerde yaklaşık 12-14 basamaklı doğruluk verdi. Tan () işlevinin bile orada sorun yaşaması beklenir.
Benzer sonuçlar, Unix'te üst düzey bir MacBook Pro dizüstü bilgisayarda ve Linux'ta üst düzey bir masaüstü bilgisayarda elde edildi.