Fortran: Behandlung von ganzzahligen Werten der Größe: ~ 700000000000

7

Momentan bringe ich mein Fortran95-Wissen auf (frag nicht warum) ...

Ich laufe allerdings auf ein Problem zu. Wie behandelt man große ganze Zahlen, z. die Größe von: ~ 700000000000

INTEGER (KIND = 3) kann diese Nummer nicht halten. Wenn jemand interessiert ist, ist der verfügbare Compiler Silverfrost FTN95.

Ich verwende die Ganzzahl, um einen größeren Datensatz zu durchlaufen.

Haben Sie Vorschläge?

    
Daniel 05.03.2010, 22:31
quelle

6 Antworten

16

Die Standardlösung (seit Fortran 95, also nehme ich an, dass dein Compiler das unterstützt) ist die SELECTED_INT_KIND ist intrinsisch, um nach gültigen Ganzzahlarten (deren Werte compilerabhängig sind) und nach HUGE intrinsisch.

  • SELECTED_INT_KIND (R) gibt den Typ-Typ-Parameter eines Integer-Typs zurück, der alle Integer-Werte n mit -10 ^ R & lt; n & lt; 10 ^ R (und gibt -1 zurück, wenn kein solcher Typ existiert).
  • HUGE (K) gibt die größte darstellbare Zahl im Integer-Typ der Art K zurück.

Zum Beispiel auf meinem Mac mit einem x86_64-Prozessor ( gfortran Compiler, 64-Bit-Modus), das folgende Programm :

%Vor%

Ausgänge:

%Vor%

was mir sagt, dass ich einen integer(kind=8) für deinen Job verwenden würde.

    
F'x 06.03.2010, 08:20
quelle
6

Für Fortran gibt es eine Reihe kostenloser Bibliotheken mit beliebiger Genauigkeit , die sich mit diesem Problem befassen. FMLIB ist eins. Fünf oder sechs weitere Alternativen sind von dieser Seite aus verlinkt .

    
ire_and_curses 05.03.2010 23:12
quelle
6

Das portable, um eine Ganzzahl "index" zu deklarieren, die mindestens 12 Dezimalziffern hat, ist:

%Vor%

Der "kind=" kann weggelassen werden.

Die Verwendung bestimmter Werte wie z. B. 3 ist nicht portabel und nicht empfehlenswert. Einige Compiler verwenden die Typnummern nacheinander, andere verwenden die Anzahl der Bytes. Das "selected_int_kind" gibt die Art-Nummer des kleinsten Integer-Typs zurück, der dem Compiler zur Verfügung steht und die angeforderte Anzahl von Ziffern darstellen kann. Wenn kein solcher Typ vorhanden ist, wird -1 zurückgegeben, und der Wert schlägt fehl, wenn zur Deklaration einer Ganzzahl ein Wert verwendet wird.

Sowohl gfortran als auch ifort geben eine Art für die Eingabe von Dezimalzahlen nach selected_int_kind bis zu 18 zurück. Große Werte wie 18 wählen typischerweise eine 8-Byte-Ganzzahl mit einem größten positiven Wert von 9223372036854775807. Diese hat 19 Ziffern, aber wenn a Compiler unterstützt diesen Typ, aber nicht länger, selected_int_kind (19) wird -1, weil nicht alle Ganzzahlen mit 19 Ziffern darstellbar sind.

    
M. S. B. 06.03.2010 08:20
quelle
2

Wenn Sie es als Schleifensteuerungsvariable verwenden, aber nicht direkt den Integerwert verwenden (was vermutlich nicht möglich ist, da Sie kein Array deklarieren können, das größer als der größte Index ist, oder?) , dann denke ich, dass es die Sache ist, den Welpen durch etwas wie 100000 zu teilen und seine Schleife in eine andere Schleife zu verschachteln, die das oft wiederholt.

    
T.E.D. 05.03.2010 22:41
quelle
0

Haben Sie versucht INTEGER (KIND = 4)?

    
JEK 05.03.2010 22:52
quelle
0

Unsere Antwort darauf bestand darin, den Wert in eine Variable mit doppelter Genauigkeit zu setzen und eine DINT-Anweisung auszuführen, um alle Bruchteile zu entfernen. Die Ergebnisse sind eine Ganzzahl, die in eine Variable mit doppelter Genauigkeit eingegeben wird. Die Funktion DINT ist nicht immer für alle FORTRANs verfügbar. Die Funktion ist eine Ganzzahlfunktion mit doppelter Genauigkeit, die sehr große Ganzzahlen (bis zu 17 Ziffern) ermöglicht.

    
Dave 05.03.2010 22:54
quelle