FORTRAN: Difference between revisions
(→Fixed Form und Free Form: reg. Expr.) |
|||
Line 1: | Line 1: | ||
== Fixed Form und Free Form == | |||
Die Free Form ist der Fixed Form der übersichtlichkeitshalber vorzuziehen. Ausserdem können bei der Fixed Form Fehler entstehen, die der compiler nicht abfängt (z. B. Formeln die über den Rand gehen - in SMUSI war beispielsweise eine Stelle, wo statt mit 300 nur mit 3 multipliziert wurde. | |||
Für die Umstellung gibts hier eine regular Expression, die alle Zeilen anzeigt die länger als 72 Zeichen sind: | |||
<pre> | |||
^[^cC!][^!]^72 | |||
</pre> | |||
== Real Werte und Vergleiche == | == 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. | 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. |
Revision as of 00:41, 12 August 2008
Fixed Form und Free Form
Die Free Form ist der Fixed Form der übersichtlichkeitshalber vorzuziehen. Ausserdem können bei der Fixed Form Fehler entstehen, die der compiler nicht abfängt (z. B. Formeln die über den Rand gehen - in SMUSI war beispielsweise eine Stelle, wo statt mit 300 nur mit 3 multipliziert wurde.
Für die Umstellung gibts hier eine regular Expression, die alle Zeilen anzeigt die länger als 72 Zeichen sind:
^[^cC!][^!]^72
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.)
Momentaner Favorit ist: FortranEpsilonfürNull = 2 * Epsilon(...)
- Anmerkung
- Im Code von BlueM sind ein paar nicht korrekte Anweisungen enthalten: MAX(dumdidum,global_FastNull). Korrekt ist MAX(dumdidum,0.0E0)
<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)) ! nach Rechenoperationen erwies sich Epsilon als zu ungenau bzw. genau !isnull = (abs(a/b-1.0E0) < eps) !Relativvergleich - führte bei Tests aber zu Fehlern
isNull = (abs(a-b) < SPACING(0.0E0)) </fortran>
Links:
Vergleich von Realwerten [1] dem intelforum Guter Artikel über Problemetik: Perils of Floating Point]