FORTRAN: Difference between revisions

From BlueM
Jump to navigation Jump to search
(→‎Vergleich von Realzahlen: +++ no Epsilon +++ now Spacing +++)
Line 17: Line 17:
Momentan wird im Rechenkern mit unterschiedlichen Vergelichen gerechnet (global_fastnull etc.)
Momentan wird im Rechenkern mit unterschiedlichen Vergelichen gerechnet (global_fastnull etc.)


Mit Epsilon() kommt man wohl nicht zum ZIEL, da sich Epsilon laut dr. Fortran an der 1.0 orientiert [http://softwarecommunity.intel.com/isn/Community/en-US/forums/thread/30231255.aspx].
Mit Epsilon() kommt man wohl nicht zum ZIEL, da sich Epsilon laut Dr. Fortran an der 1.0 orientiert [http://softwarecommunity.intel.com/isn/Community/en-US/forums/thread/30231255.aspx|siehe hier].
Dr. Fortran schlägt Spacing() vor! Allerdings sollten wir dann überprüfen ob wir gegen Null checken wollen oder zwei Werte vergleichen. Bei letzterem können wir auch das Spacing() zurückgreifen.
Dr. Fortran schlägt Spacing() vor! Allerdings sollten wir dann überprüfen ob wir gegen Null checken wollen oder zwei Werte vergleichen. Bei letzterem können wir auch das Spacing() zurückgreifen.


Line 39: Line 39:
</fortran>
</fortran>


=== Links: ===
==== Links: ====
Vergleich von Realwerten [http://hodgson.pi.tu-berlin.de/Lehre/EDV1/skripte/f95_skript/node56.html]
Vergleich von Realwerten [http://hodgson.pi.tu-berlin.de/Lehre/EDV1/skripte/f95_skript/node56.html]
 
[http://softwarecommunity.intel.com/isn/Community/en-US/forums/thread/30231255.aspx|Aus dem intelforum]
Guter Artikel über Problemetik: [http://www.lahey.com/float.htm|The Perils of Floating Point]




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

Revision as of 05:01, 25 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.)

Mit Epsilon() kommt man wohl nicht zum ZIEL, da sich Epsilon laut Dr. Fortran an der 1.0 orientiert hier. Dr. Fortran schlägt Spacing() vor! Allerdings sollten wir dann überprüfen ob wir gegen Null checken wollen oder zwei Werte vergleichen. Bei letzterem können wir auch das Spacing() zurückgreifen.

<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]