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.
nicht für abs (arg)> 1 aber Komplex ist in Ordnung. Aber mein Ergebnis muss echt sein. –
Entschuldigung brainfault –
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. –