Frage

Ich versuche, mit großen Zahlen (~10^14) zu arbeiten, und ich muss in der Lage sein, sie zu speichern und über Schleifen dieser Länge zu iterieren, d. h.

n=SOME_BIG_NUMBER
do i=n,1,-1

Ich habe die übliche Sternnotation ausprobiert, kind=8 usw.aber nichts scheint zu funktionieren.Dann habe ich das überprüft huge intrinsische Funktion und der Code:

program inttest

print *,huge(1)
print *,huge(2)
print *,huge(4)
print *,huge(8)
print *,huge(16)
print *,huge(32)

end program inttest

ergibt in allen Fällen die Nummer 2147483647.Warum ist das?Ich verwende gfortran (f95) auf einem 64-Bit-Computer.

Wenn ich eine Bignum-Bibliothek benötige, welche schlagen die Leute vor?

War es hilfreich?

Lösung

Die GfortRAN-Versionen, die ich auf einem Mac verwende, 4.3, 4.4 und 4.5 auf einem Mac, unterstützen 8-Byte-Ganzzahlen. Der beste Weg, um einen Variablentyp in Fortran>= 90 auszuwählen, ist, eine intrinsische Funktion zu verwenden, um die Genauigkeit anzugeben, die Sie benötigen. Versuchen Sie:

generasacodicetagpre.

, um mindestens 18 Dezimaltziffellungen zu erhalten, die typischerweise eine 8-Byte-Ganzzahl sein wird.

mit gfortTran 4.3, riesiger (1_largeint_k) Ausgänge 9223372036854775807. Wenn Sie riesig (1) usw. geschrieben haben, war die Konstante standardmäßig eine Standard-Ganzzahl, hier offensichtlich 4-Byte, da riesig 2147483647 zurückging. Die Genauigkeit der Konstanten, nicht nur Variablen - häufiger ist diese Ausflüge, wenn sie auf eine echte Konstante signifikante Figuren verlieren, was den standardmäßigen Präzision standardmäßig ausfällt.

siehe auch Fortran: Ganzzahl * 4 vs Ganzzahl (4) vs Ganzzahl (Kind= 4)

Normalerweise hat Gfortran den Befehlsnamen Gfortran. Könnte F95 ein anderer Compiler sein? Versuchen Sie "Gfortran -V" und "F95 -V".

Andere Tipps

Sie haben die genaue Definition von missverstanden HUGE Funktion. HUGE(num) gibt die größte Zahl mit der gleichen Art und dem gleichen Typ zurück wie num.Der zurückgegebene Wert hat auch die gleiche Art und den gleichen Typ wie num.Da alle Ihre Eingabewerte (Standard-)Ganzzahlen sind HUGE, korrekt, gibt die größte Ganzzahl mit Standardgröße zurück.

HUGE(num) gibt nicht die größte Ganzzahl mit zurück kind=num.Auch nicht HUGE(num) Gibt die größte darstellbare Zahl zurück num Bytes.Während viele Compiler verwenden integer(kind=4) Und integer(kind=8) usw Für 4- und 8-Byte-Ganzzahlen wird dies durch den Sprachstandard nicht garantiert und man kann sich nicht darauf verlassen, dass es portierbar ist.

Die Antwort von @MSB zeigt Ihnen, wie Sie tun können, was Sie wollen. Ich melde mich nur mit einer Klarstellung an.

Zusammenfassung: Erwägen Sie das Betrachten von Compiler-Optionen.

Es ist eine L-O-N-G-Zeit, seit ich Fortran getan habe, und ich erinnere mich nicht an riesige (), aber ich habe mir das ein wenig angesehen. Meine Intel Linux-Maschine hat Gfortran 4.1.2. Ich fand, ich musste mit der Option -fDefault-Integer-8 kompilieren, die eingeschaltet ist, um es für 64-Bit-Ganzzahlen zu funktionieren. Mit diesem Code:

generasacodicetagpre.

läuft

$ gfortran inttest.Für

Erstellt eine ausführbare Datei, die gedruckt wurde:

2147483647

läuft jedoch:

$ gfortran -fdefault-integer-8 inttest.Für

führte zu einer ausführbaren Datei, die der Ausgabe ergab:

9223372036854775807

auch, wenn ich eine Variable als Ganzzahl * 8 deklariert habe und ohne die Option -fDefault-Integer-8 zusammengestellt wurde, habe ich einen Fehler erhalten. Der Code:

generasacodicetagpre.

läuft

$ gfortran inttest2.Für

ergab in

in der Datei inttest.For: 4

generasacodicetagpre.

Fehler: Ganzzahl zu groß für seine Art bei (1)

Die Dinge funktionierten jedoch gut, als ich mit der Option -fDefault-Integer-8 zusammengestellt habe, und ich bekam eine ausführbare Datei, die gedruckt hat

9223372036854775807

Vielleicht gibt es andere Gfortran-Optionen, die nützlich sein würden, aber ich habe nicht weiter untersucht.

erteilt, bekommt dies immer noch nicht 10 ^ 14, aber es kann helfen, die Ergebnisse zu erklären, die Sie gesehen haben.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top