2016-04-13 8 views
1

Mit Fortran Ich habe einige Routinen, die eine Reihe von Aufrufen zu acos() und asin() sowie atan() usw. macht. In einer bestimmten Routine wird die Berechnung des Arguments manchmal illigent (dh acos (1.0000001)), wenn Variablen mit einfacher Genauigkeit verwendet werden. Mit doppelter Genauigkeit geht das weg, aber mit einer verlangsamten Geschwindigkeit von etwa 50 - 70%. Die einzige andere Art, wie ich denken kann, ist das Argument zu begrenzen:Fortran Acos Funktion Argument Robustheit

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

Es scheint, obwohl als eine langsame Methode, es zu tun. Gibt es einen schnelleren Weg? I.e. Pre-Limit angle, so dass es nur Werte in diesem Fall zwischen -1 und 1?

Edit: Argumente sind und Ergebnisse müssen real (nicht komplex) sein.

+0

nicht für abs (arg)> 1 aber Komplex ist in Ordnung. Aber mein Ergebnis muss echt sein. –

+0

Entschuldigung brainfault –

+3

Die 'min' und' max' intrinsics sind möglicherweise schneller als die 'if' Bedingung. Sie riskieren immer noch das gleiche Problem, sogar in doppelter Genauigkeit, es ist wahrscheinlich weniger wahrscheinlich. –

Antwort

0

Ich könnte

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

versuchen und hoffe, mein Compiler nicht arg1/arg2 zweimal macht. Wenn es so wäre, würde ich versuchen es vorberechnen und zweimal benutzen.