Ist es möglich, sehr kleine Zahlen in Fortran wie 1E-1200
zu erreichen? Ich weiß, wie man es in Python macht, aber mein Code für Master-Thesis läuft zu langsam. Mein Vorgesetzter empfiehlt mir, Fortran zu verwenden, aber ich bin mir nicht sicher, ob das ein Problem ist.Sehr kleine Zahlen in Fortran
Antwort
Die meisten Fortran-Compiler unterstützen das REAL128-Datenformat, das mit IEEE binary128 übereinstimmt. Einige unterstützen auch REAL80 mit ähnlicher Reichweite, passendem C-Long-Double. Diese haben keine Leistung von REAL64, sollten aber viel schneller als Python sein.
C legt nicht fest, welches Format "long double" sein soll, also sind alle anderen Typen. In MSVC ist 'long double' genau dasselbe wie' double'. In Plattformen ohne erweiterte 80-Bit-Genauigkeit kann IEEE-754 doppelte oder vierfache Genauigkeit sein –
Die kurze Antwort ist ja.
Moderne Compiler unterstützen typischerweise sogenannte Quad-Präzision, eine 128-Bit-Real. Eine portable Möglichkeit, auf diesen Typ zuzugreifen, ist die Verwendung des ISO_FORTRAN_ENV
. Hier ist ein Beispielprogramm zu zeigen, wie groß und klein diese Zahlen erhalten:
program main
use ISO_FORTRAN_ENV, only : REAL32, REAL64, REAL128
! -- tiny and huge grab the smallest and largest
! -- representable number of each type
write(*,*) 'Range for REAL32: ', tiny(1._REAL32), huge(1._REAL32)
write(*,*) 'Range for REAL62: ', tiny(1._REAL64), huge(1._REAL64)
write(*,*) 'Range for REAL128: ', tiny(1._REAL128), huge(1._REAL128)
end program main
Die Typen REAL32
, REAL64
und REAL128
typischerweise bekannt sind als Einzel-, Doppel-, und Quad Präzision. Längere Typen haben einen größeren Bereich von darstellbaren Nummern und größere Präzision.
Auf meinem Rechner mit gfortran 4.8, erhalte ich:
mach5% gfortran types.f90 && ./a.out
Range for REAL32: 1.17549435E-38 3.40282347E+38
Range for REAL62: 2.2250738585072014E-308 1.7976931348623157E+308
Range for REAL128: 3.36210314311209350626E-4932 1.18973149535723176502E+4932
Wie Sie sehen können, können Quad Präzision Zahlen so klein darstellen als 3.4E-4932
.
Die vorherigen Antworten, die die Verwendung von REAL128 aus ISO_FORTRAN_ENV vorschlagen, beschreiben eine nicht portable Lösung. Was Sie hier bekommen würden, ist ein realer Typ, dessen Darstellung 128 Bits ist, aber das sagt nichts über die Reichweite oder Genauigkeit des Typs aus! Zum Beispiel haben einige IBM-Systeme eine echte 128-Bit-Art, die tatsächlich zwei Doppelgänger mit einem Offset-Exponenten ist. Dies bringt Ihnen mehr Präzision, aber nicht wesentlich mehr Reichweite.
Der richtige Weg, dies zu tun, ist die intrinsische Funktion SELECTED_REAL_KIND zu verwenden, um die Art der Implementierung zu bestimmen, die den gewünschten Bereich unterstützt. Zum Beispiel:
integer, parameter :: bigreal = SELECTED_REAL_KIND(R=1200)
real(KIND=bigreal) :: x
Wenn die Implementierung keine wirkliche Art hat, die einen Wert mit einem Dezimalexponenten von plus oder minus 1200 darstellen kann, erhalten Sie eine Fehlermeldung erhalten, sonst werden Sie die kleinste geeignete erhalten nett.
Sie könnten auch einen P = Wert im Aufruf angeben, um anzugeben, welche Mindestpräzision (in Dezimalziffern) Sie benötigen.
- 1. Sehr seltsam Fortran-Fehler beim Vergleichen ganzen Zahlen
- 2. Sehr kleine Materialschrift
- 3. Tricking numpy/Python in repräsentieren sehr große und sehr kleine Zahlen
- 4. GridBagLayout Schaffung sehr kleine Platten
- 5. Sehr kleine Skala auf Highcharts
- 6. Problem mit sehr kleinen Zahlen?
- 7. Sehr, sehr große Zahlen in vb.net
- 8. Präzisionsprobleme von reellen Zahlen in Fortran
- 9. C++ sehr seltsame Zahlen
- 10. Wie kleine Zahlen in Postgresql darstellen?
- 11. konvertieren sehr kleine Doppel zu einem String
- 12. Microsoft Visual Studio 2012 sehr kleine Befehlszeile
- 13. Fortran lesen gemischten Text und Zahlen
- 14. C++ Hinzufügen von 1 zu sehr kleine Zahl?
- 15. Binomialtest in Python für sehr große Zahlen
- 16. Lesen sehr kleiner Zahlen in R
- 17. Arbeiten mit sehr großen Zahlen in Python
- 18. Verhindern, dass php kleine Zahlen abrundet
- 19. Wie kann ich dieses sehr kleine C-Programm schneller machen?
- 20. Standardthreads in C# sehr kleine Konsolenanwendung (Visual Studio 2012)
- 21. Wrap Text um sehr kleine Bilder in Latex
- 22. Absolut notwendige UML-Diagramme auch für sehr kleine Projekte?
- 23. Warum verliert dieses sehr kleine Java-Programm Speicher?
- 24. auswerten 1/tanh (x) - 1/x für sehr kleine x
- 25. Sehr schlechte Qualität und zu kleine Snapshot der Kartenaktivität
- 26. Konvertieren String für große und kleine Zahlen sas
- 27. Machen Sie kleine und große Zahlen von Menschen lesbaren
- 28. Shop sehr große Zahlen in wissenschaftlicher Notation Form in SQL
- 29. Ausführen von mathematischen Operationen an sehr großen Zahlen in Perl
- 30. Fortran DEALLOCATE
Ich bin ein Fortranner, aber trotzdem würde ich prüfen, ob der Algorithmus schnell genug ist. Das Ändern der Sprache macht keine Wunder, obwohl einige Schleifen in Python langsam sind. –
Hi @ wafelos, Es ist oft der Fall, dass bei Verwendung eines geeigneten Einheitensystems (d. H. Atomeinheiten https://en.wikipedia.org/wiki/Atomic_units) der Bereich der Fließkommazahlen viel enger wird. Es ist wichtig zu wissen, dass die Verwendung von 128 Präzisionstypen Ihre Berechnungen wahrscheinlich verlangsamen wird, da sie nicht von der Hardware unterstützt werden. –