FORTRAN: Difference between revisions

From BlueM
Jump to navigation Jump to search
Line 30: Line 30:


=== Vergleich von Realzahlen ===
=== Vergleich von Realzahlen ===
Momentan wird im Rechenkern mit unterschiedlichen Vergelichen gerechnet (global_fastnull etc.)
:''siehe Bug 367''
Früher wurde im Rechenkern mit unterschiedlichen Vergleichen gerechnet (<code>GLOBAL_NULL</code>, <code>GLOBAL_FASTNULL</code> etc.)


Momentaner Favorit ist: FortranEpsilonfürNull =  2 * Epsilon(...)
'''Momentan verwendet:'''
 
<fortran>
;Anmerkung: Im Code von BlueM sind ein paar nicht korrekte Anweisungen enthalten: MAX(dumdidum,global_FastNull). Korrekt ist MAX(dumdidum,0.0E0)
R8_EPSILON =  2 * Epsilon(...)
</fortran>


'''Diskussion:'''
<fortran>
<fortran>
real*4 a
real*4 a
Line 41: Line 44:
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) !früher im Projekt verwendet
 
isNull = (a - b < global_fastnull) !aktuell im Projekt verwendet




Line 55: Line 57:
</fortran>
</fortran>


==== Links: ====
====Anmerkung====
Vergleich von Realwerten [http://hodgson.pi.tu-berlin.de/Lehre/EDV1/skripte/f95_skript/node56.html]
Im Code von BlueM sind ein paar nicht korrekte Anweisungen enthalten:
[http://softwarecommunity.intel.com/isn/Community/en-US/forums/thread/30231255.aspx|Aus dem intelforum]
<fortran>
Guter Artikel über Problemetik: [http://www.lahey.com/float.htm|The Perils of Floating Point]
MAX(dumdidum,R8_EPSILON)
MAX(dumdidum,R4_EPSILON)
</fortran>
Korrekt ist aber:
<fortran>
MAX(dumdidum,0.0D0)
MAX(dumdidum,0.0E0)
</fortran>
 
==== Links ====
* [http://hodgson.pi.tu-berlin.de/Lehre/EDV1/skripte/f95_skript/node56.html Vergleich von Realwerten]
* [http://softwarecommunity.intel.com/isn/Community/en-US/forums/thread/30231255.aspx Aus dem Intel-Forum]
* Guter Artikel über Problematik: [http://www.lahey.com/float.htm The Perils of Floating Point]




[[Kategorie: Fortran]]]
[[Kategorie: Fortran]]

Revision as of 06:13, 10 October 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:

Identizieren von Problemstellen

^[^cC!][^!]^72

Bereinigen von Leerzeichen am Ende

(:b+)$

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

siehe Bug 367

Früher wurde im Rechenkern mit unterschiedlichen Vergleichen gerechnet (GLOBAL_NULL, GLOBAL_FASTNULL etc.)

Momentan verwendet: <fortran> R8_EPSILON = 2 * Epsilon(...) </fortran>

Diskussion: <fortran> real*4 a real*4 b logical isNull

isNull = (a == b) !wird sogut wie nie erfüllt

isNull = (a - b < global_fastnull) !früher 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>

Anmerkung

Im Code von BlueM sind ein paar nicht korrekte Anweisungen enthalten: <fortran> MAX(dumdidum,R8_EPSILON) MAX(dumdidum,R4_EPSILON) </fortran> Korrekt ist aber: <fortran> MAX(dumdidum,0.0D0) MAX(dumdidum,0.0E0) </fortran>

Links