2016-04-13 33 views
1

Fortran kullanma acos() ve asin() ile atan() vb. Gibi birçok çağrı yapan bazı rutinlerim vardır. Belirli bir yordamda argüman hesaplaması bazen illiegal olur (ör. Tek hassas değişkenler kullanılırken acos (1.0000001)). Çifte hassasiyet kullanarak bu gider, ancak hızı yaklaşık% 50 - 70 arasındadır. gerçi bunu yapmanın yavaş yöntemi olarakfortran acos işlev argüman sağlamlığı

arg3= arg1/arg2 
if (angle > 1) then 
    arg3= 1 
else if (angle < -1) then 
    arg3= -1 
end if 
angle= acos(arg3) 

görünüyor: Aklıma diğer tek yolu argüman sınırlamaktır. Daha hızlı bir yolu var mı? Yani angle ön limiti, sadece bu durumda değerleri -1 ve 1 arasında alır;

Düzenleme: bağımsız değişkenler ve sonuçların gerçek olması (karmaşık olmayan) olması gerekir.

+0

abs (arg)> 1 için değil, ancak karmaşıktır. Ama sonuçumun gerçek olması gerekiyor. –

+0

üzgünüm beyin zararı –

+3

'min' ve' max' intrinsics 'if' durumundan daha hızlı olabilir. Aynı problemi çift hassasiyette bile riske atıyorsunuz, muhtemelen daha az olasıdır. –

cevap

0

Ben

angle = acos(sign(min(abs(arg1/arg2),1.0),arg1/arg2)) 

denemek ve benim derleyici iki kez arg1/arg2 yapmaz umut olabilir. Eğer öyleyse, ön bilgisayar kullanmayı ve iki kez kullanmayı denedim.

İlgili konular