FORTRAN: Difference between revisions
(→Vergleich von Realzahlen: Epsilon-Methode) |
|||
Line 16: | Line 16: | ||
=== Vergleich von Realzahlen === | === Vergleich von Realzahlen === | ||
Momentan wird im Rechenkern mit unterschiedlichen Vergelichen gerechnet (global_fastnull etc.) | Momentan wird im Rechenkern mit unterschiedlichen Vergelichen gerechnet (global_fastnull etc.) | ||
Der Schlüssel scheint die Intel-Fortran-methode Epsilon zu sein. Epsilon gibt wohl die Ungenauigkeit je nach Kind (single oder double) zurück. | |||
<fortran> | <fortran> | ||
Line 21: | Line 23: | ||
real*4 b | real*4 b | ||
logical isNull | logical isNull | ||
isNull =(a == b) !wird sogut wie nie erfüllt | isNull =(a == b) !wird sogut wie nie erfüllt | ||
isNull = (a - b < global_fastnull) !aktuell im Projekt verwendet | isNull = (a - b < global_fastnull) !aktuell im Projekt verwendet | ||
!Alternativen (zur Diskussion) | !Alternativen (zur Diskussion) | ||
isnull = (abs(a - b) < Epsilon(a)) | isnull = (abs(a - b) < Epsilon(a)) | ||
! | !isnull = (abs(a/b-1.0E0) < eps) !Relativvergleich - führte bei Tests aber zu Fehlern | ||
</fortran> | </fortran> | ||
Revision as of 07:18, 24 June 2008
Real Werte und Vergleiche
Ein wichtiger Punkt bei der Programmierung mit Fortran ist die Behandlung der Real Werte. Insbesondere der vergleich, ob zwei Real Werte gelich sind, ist in FORTRAN nur durch eine erweiterte Syntax möglich.
Zuweisen von Werten:
<fortran> real*4 a real*8 b
a = 0.123e0 !das e0 kennzeichnet den Wert als real*4
b = 0.123d0 ! das d0 kennzeichnet den Wert als real*8 </fortran>
Vergleich von Realzahlen
Momentan wird im Rechenkern mit unterschiedlichen Vergelichen gerechnet (global_fastnull etc.)
Der Schlüssel scheint die Intel-Fortran-methode Epsilon zu sein. Epsilon gibt wohl die Ungenauigkeit je nach Kind (single oder double) zurück.
<fortran> real*4 a real*4 b logical isNull
isNull =(a == b) !wird sogut wie nie erfüllt
isNull = (a - b < global_fastnull) !aktuell im Projekt verwendet
!Alternativen (zur Diskussion)
isnull = (abs(a - b) < Epsilon(a)) !isnull = (abs(a/b-1.0E0) < eps) !Relativvergleich - führte bei Tests aber zu Fehlern </fortran>
Links:
Vergleich von Realwerten [1]]