Archiv verlassen und diese Seite im Standarddesign anzeigen : Maschinengenauigkeit !!! WICHTIG !
wohlstandskind666
27.10.2003, 16:08
Hallo zusammen !
Ich muss einen Algorithmus in Fortran schreiben, um die Maschinengenauigkeit des Rechners zu bestimmen. Habe folgenden Quellcode bekommen:
SUBROUTINE TEST_EPS
IMPLICIT NONE
DOUBLE PRECISION s, e, d
e = 1
1) e = e / 2
d = 1 + e
IF (d .EQ. 1) THEN
GOTO 2
ENDIF
GOTO 1
2) s = e + e
WRITE (*,*) 'eps :', s
END
Soweit so gut ! Funktioniert auch ! ABER: Wozu nehme ich e am Ende noch mal zwei ? (Also e + e) VERSTEHE ICH NICHT ... BITTE HELFEN !
Na ja, wenn 1 + e == e, dann ist auch 1 - e == e, oder?
Jan Krüger
28.10.2003, 23:05
Soweit klar, aber das "e+e" verstehe ich ehrlich gesagt auch nicht.
Ich wusste es auch nicht. Aber google hilft. :)
Erster Treffer bei Maschinengenauigkeit liefert:Die Maschinengenauigkeit ist die kleinste Zahl, deren Addition zu 1 von der Maschine noch gemerkt wird
Durch das e+e wird die letzte Halbierung rückgängig gemacht, nach der die Addition ja nicht mehr gemerkt wurde.
Ein bisschen gefährlich finde ich das aber schon. Eigentlich hätte man den letzten Wert einfach noch in einer separaten Variable aufheben müssen. Sobald wir uns im Bereich der inkorrekten Rechnungen bewegen, muss ja keineswegs mehr gelten e = 2 * (e / 2)
Die Maschinengenauigkeit ist die kleinste Zahl, deren Addition zu 1 von der Maschine noch gemerkt wird
Ok, mit der Definition ist es klar. Ich wusste es auch nicht, dachte halt es "wird wohl sowas sein". ;)
Wegen der Ungenauigkeit: ich denke mal wenn 1+e==e, dann gibt e+e das richtige Ergebnis, floats werden ja "nach oben hin" ungenauer. Aber wer weiß... :)
Eigentlich hast du ja recht.
Aber trotzdem. Sobald man von Genauigkeit redet, muss man sich der Ungenauigkeit der Zahldarstellungen bewusst sein. Und Fliesskommazahlen sind eben nicht genau.
Wenn man bei
1) e = e / 2
durch
e = e * 0.99
ersetzt muss man trotzdem, um das richtige (?)
Ergebnis zu erhalten e verdoppeln bzw. man
erhält bei naiver Vorgehensweise die Hälte der
wahren Lösung?
Der Grund ist wohl subtil.
Gemäß den Numerical Recipies ist die Bestimmung von
Maschinenparametern nicht so einfach
(aufgrund von overflow und underflows ???):
http://www.library.cornell.edu/nr/bookcpdf/c20-1.pdf
Die Lösung steht wohl in dem Paper von Cody:
http://doi.acm.org/10.1145/50063.51907
Dies ist aber leider nicht ohne die
entsprechende Zugangsberechtigung erhaltbar.
Wenn jemand an einer Hochschul e Zugang hierzu hat,
wäre es nett wenn er die Lösung posten könnte.
aus http://www.netlib.org/toms/665 (bezieht sich auf das Cody-Paper):
C EPS - the smallest positive floating-point number such
C that 1.0+EPS .NE. 1.0. In particular, if either
C IBETA = 2 or IRND = 0, EPS = FLOAT(IBETA)**MACHEP.
C Otherwise, EPS = (FLOAT(IBETA)**MACHEP)/2
Vergleicht man die letzten beiden Zeilen,
stellt man fest, dass der Faktor 2 wichtig ist ?????
Versuche weiterhin eine befriedigende Lösung zu finden.
Werde aber diese im zweiten Thread mit dem gleichen Thema
posten:
http://www.coding-board.de/board/showthread.php?t=15936
vBulletin® v3.8.6, Copyright ©2000-2012, Jelsoft Enterprises Ltd.