Sebastian Hegler schrieb:
Am 03.05.2007 um 09:05 schrieb Tobias Schlemmer:
Ich würde mal denke, doppelte Fließkomma-Rechnung spielt in der Computergrafik keine Rolle. Da fällt es nicht auf wenn mal ein halbes Pixel daneben geht. In F95 ist sogar vierfache Genauigkeit drin. Beim gfortran ist es glaube ich Kind = 12.
10 oder 16 je nach Prozessor-Architektur.
Falsch, kann man definieren wie man will. 686er CPUs stellen 80bit-FP-Register zur Verfügung (KIND=10). "double double"/"quad" (KIND=16) gibts auch, ist aber blöd von Hand zu programmieren.
die 10 oder 16 bezogen sich ausschließlich auf gfortran. Und wenn ich der gfortran-Mailingliste glauben darf, dann wird immer nur eines von beiden unterstützt. Auch wenn beide von der Architektur unterstützt werden.
Deswegen verstecken die Fortran-Compiler es hinter den KIND-Parametern. Du kannst Dir mit SELECTED_REAL_KIND selbst Genauigkeitsbereiche definieren, ohne die unterliegende Hardware zu kennen, was Sinn und Zweck der Übung ist. (gfortran tut (tat?) das mit libmpfr und libgmp.)
libmpfr und libgmp werden ausschließlich zum reduzieren von konstanten Ausdrücken verwendet, damit das Programm auf allen Architekturen die gleichen Startwerte bekommt. Zur Laufzeit werden die Bibliotheken nicht verwendet.
Z.B.: REAL(KIND=8) :: x ! double REAL(KIND=SELECTED_REAL_KIND(100,50)) :: y ! 100 Dezimal(!)-Stellen Genauigkeit im Exponentenbereich 10^(-50) bis 10^50
Nenne mir einen Compiler, der das kann!
Die Kind-Parameterwerte sind dummerweise Kompilerabhängig.
Sind sie nicht, deren Funktionsweise ist im Standard definiert. Manche Compiler unterstützen manche KINDs nicht, s.o.
Falsch. Der Standard legt die funktionsweise der KIND-Parameter nicht auf Bytezahlen (wie bei gfortran,ifort u.a.) fest. Bytes gibt es im Fortran-Standard nämlich diesbezüglich nicht, um ihn auch auf exotische Architekturen anwenden zu können.
werden um zu prüfen, liege ich noch im Intervall oder bin ich im digitalen Nirvana.
Na ja, es gibt noch +Infinity, -Infinity und NaN.
Eigentlich müßte um jede Rechenoperation ein Exeptionhandling gemacht Und genau dafür kannst Du definieren, ob die FPU beim Auftreten eines solchen Wertes eine "Floating Point Exception" auslöst, und einen definierten "Exception Handler" ausführt. Diese Checks sind aber so teuer (zeitintensiv) und so umstritten (mehr Genauigkeit -- Bitstellen, s.o. -- langt meistens, oder ne Weiterbildung der Programmierer zur Vermeidung "klassischer Fehler"), daß sie kaum benutzt werden.
Ja, da war was von wegen signalisierenden und nicht signalisierenden NaNs.
Tobias.