ANHANG 5 Intrinsische Funktionen in Fortran 90 Es gibt eine große Anzahl von intrinsischen Funktionen und fünf intrinsische Subroutinen in Fortran 90. Ich behandle die numerischen und mathematischen Routinen sehr kurz, da sie nicht von Fortran 77 geändert werden und daher gut bekannt sein sollten. Dieser Abschnitt basiert auf Abschnitt 13 der ISO-Norm (1991), der eine formalere Behandlung enthält. Wir folgen der Anordnung der verschiedenen Funktionen und Subroutinen im Standard, erklären aber direkt in der Liste. Für eine detailliertere Behandlung verweisen wir auf Metcalf und Reid (1990, 1993). Wenn ein Parameter unten optional ist, wird er in Kleinbuchstaben angegeben. Wenn eine Argumentliste mehrere Argumente enthält, kann die Funktion entweder durch positionsbezogene Argumente oder durch ein Schlüsselwort aufgerufen werden. Das Schlüsselwort muss verwendet werden, wenn ein vorheriges Argument nicht enthalten ist. Schlüsselwörter sind normalerweise die Namen, die unten angegeben werden. Wir haben nicht immer alle natürlichen Beschränkungen auf die Variablen gegeben, zum Beispiel, dass der Rang nicht erlaubt ist, negativ zu sein. Die Funktion PRÄSENT (A) gibt. TRUE zurück. Wenn das Argument A in der Anrufliste ist,.FALSE. Im anderen Fall. Die Verwendung ist im Beispielprogramm in Kapitel 8 des Haupttextes dargestellt. Von Fortran 77 sind ABS, AIMAG, AINT, ANINT, CMPLX, CONJG, DBLE, DIM, DPROD, INT, MAX, MIN, MOD, NINT, REAL und SIGN erhältlich. Darüber hinaus wurden die Fortschritte von CEILING, FLOOR und MODULO zu Fortran 90 hinzugefügt. Nur das letzte ist schwer zu erklären, was am einfachsten mit den Beispielen von ISO (1991) möglich ist. Folgende Funktionen von Fortran 77 können einen Art-Parameter verwenden In AINT (A, Art). Nämlich AINT, ANINT, CMPLX, INT, NINT und REAL. Eine historische Tatsache ist, dass die numerischen Funktionen in Fortran 66 spezifische (verschiedene) Namen in unterschiedlichen Genauigkeiten haben mussten, und diese expliziten Namen sind immer noch die einzigen, die verwendet werden können, wenn ein Funktionsname als Argument übergeben wird. Es folgt eine vollständige Tabelle aller numerischen Funktionen. Die Namen, die mit einem Stern gekennzeichnet sind, dürfen nicht als Argumente verwendet werden. Einige Funktionen, wie INT und IFIX, haben zwei spezifische Namen, die entweder verwendet werden können. Auf der anderen Seite haben einige Funktionen keinen spezifischen Namen. Im folgenden Beispiel verwende ich C für komplexe Gleitkommawerte, D für Gleitkommawerte in doppelter Genauigkeit, I für Ganzzahlen und R für Gleitpunktwerte in Einzelpräzision. Trunkierung ist gegen Null, INT (-3,7) wird -3. Aber die Rundung ist korrekt, NINT (-3,7) wird -4. Die neuen Funktionen FLOOR und CEILING schneiden auf minus bzw. plus unendlich ab. Die Funktion CMPLX kann ein oder zwei Argumente haben, wenn zwei Argumente vorhanden sind, müssen diese vom gleichen Typ sein, aber nicht von COMPLEX. Die Funktion MOD (X, Y) berechnet X - INT (X / Y) Y. Die Vorzeichenübertragungsfunktion SIGN (X, Y) nimmt das Vorzeichen des zweiten Arguments an und setzt es auf das erste Argument ABS (X), wenn Y gt 0 und - ABS (X) wenn Y lt 0. Positive Differenz DIM ist eine Funktion, die ich nie benutzt habe, aber DIM (X, Y) gibt X-Y, wenn dies positiv und Null im anderen Fall ist. Inneres Produkt DPROD andererseits ist eine sehr nützliche Funktion, die das Produkt von zwei Zahlen in der Einzelpräzision als doppelte Präzisionszahl gibt. Es ist schnell und genau. Die beiden Funktionen MAX und MIN sind insofern eindeutig, als sie eine beliebige Anzahl von Argumenten haben können, aber mindestens zwei. Die Argumente müssen vom gleichen Typ sein, sind aber nicht zulässig vom Typ COMPLEX. Genau wie in Fortran 77. Alle trigonometrischen Funktionen arbeiten im Bogenmaß. Die folgenden sind verfügbar: ACOS, ASIN, ATAN, ATAN2, COS, COSH, EXP, LOG, LOG10, SIN, SINH, SQRT, TAN und TANH. Eine historische Tatsache ist, dass die mathematischen Funktionen in Fortran 66 spezifische (verschiedene) Namen in verschiedenen Präzisionen haben mussten, und diese expliziten Namen sind immer noch die einzigen, die verwendet werden können, wenn ein Funktionsname als Argument übergeben wird. Es folgt eine vollständige Tabelle aller mathematischen Funktionen. Im folgenden Beispiel verwende ich C für komplexe Gleitkommawerte, D für Gleitkommawerte in doppelter Genauigkeit, I für Ganzzahlen und R für Gleitpunktwerte in Einzelpräzision. Der Zweck der meisten dieser Funktionen ist offensichtlich. Beachten Sie, dass sie alle nur für Gleitkommazahlen und nicht für Ganzzahlen definiert sind. Sie können daher die Quadratwurzel von 4 als SQRT (4) nicht berechnen. Aber stattdessen können Sie NINT (SQRT (REAL (4))). Bitte beachten Sie auch, dass alle komplexen Funktionen den Hauptwert zurückgeben. Die Quadratwurzel ergibt ein echtes Ergebnis für ein reales Argument in einfacher oder doppelter Genauigkeit und ein komplexes Ergebnis für ein komplexes Argument. So gibt SQRT (-1.0) eine Fehlermeldung (normalerweise bereits zur Kompilierzeit), während Sie die komplexe Quadratwurzel mit den folgenden Anweisungen erhalten können. Das Argument für die üblichen Logarithmen muss positiv sein, während das Argument für CLOG von Null verschieden sein muss. Der Modul für das Argument für ASIN und ACOS muss höchstens 1 sein. Das Ergebnis wird in - pi / 2, pi / 2 bzw. 0, pi liegen. Die Funktion ATAN gibt einen Wert in - pi / 2, pi / 2 zurück. Die Funktion ATAN2 (Y, X) arctan (y, x) liefert einen Wert in (-pi, pi, falls Y positiv ist, ist das Ergebnis positiv Wenn X negativ ist, ist das Ergebnis negativ, wenn X Null ist, ergibt das Ergebnis plus oder minus pi / 2. Sowohl X als auch Y dürfen nicht gleichzeitig Null sein Ist eine Begrenzung für die mathematischen Funktionen die begrenzte Genauigkeit und Reichweite, was bedeutet, dass zB EXP zu Unterströmungen oder Überläufen bei ziemlich gewöhnlichen Werten des Arguments führen kann. Die trigonometrischen Funktionen erhalten sehr niedrige Genauigkeit für große Argumente. Beachten Sie, dass ACHAR mit dem Standard-ASCII-Zeichensatz arbeitet, während CHAR mit der Darstellung in dem Computer arbeitet, den Sie verwenden. Die obigen Routinen vergleichen zwei Strings mit Sortierung nach ASCII. Wenn ein String kürzer als der andere ist, werden Leerzeichen am Ende der kurzen Zeichenfolge hinzugefügt. Wenn eine Zeichenfolge ein Zeichen außerhalb des ASCII-Zeichensatzes enthält, ist das Ergebnis implementierungsabhängig. LEN (STRING) gibt die Länge einer Zeichenfolge zurück. Der Variablen STRING muss kein Wert zugewiesen werden. Die erste gibt die Art des aktuellen Arguments zurück, das vom Typ INTEGER, REAL, COMPLEX, LOGICAL oder CHARACTER sein kann. Dem Argument X muss kein Wert zugewiesen werden. Die zweite gibt eine Ganzzahl mit der angeforderten Anzahl von Ziffern zurück, und die dritte gibt die Art für Gleitkommazahlen mit numerischer Genauigkeit mindestens P-Ziffern und einen Dezimal-Exponentenbereich zwischen - R und R zurück. Die Parameter P und R müssen skalare ganze Zahlen sein. Mindestens einer von P und R muss angegeben werden. Das Ergebnis von SELECTEDINTKIND ist eine Ganzzahl von Null und aufwärts, wenn die gewünschte Art nicht verfügbar ist, erhalten Sie -1. Wenn mehrere implementierte Typen die Bedingung erfüllen, wird diejenige mit dem kleinsten Dezimalbereich verwendet. Wenn es noch mehrere Typen oder Arten gibt, die die Bedingung erfüllen, wird diejenige mit der kleinsten Artzahl verwendet. Das Ergebnis von SELECTEDREALKIND ist auch eine Ganzzahl von Null und aufwärts, wenn die gewünschte Art nicht verfügbar ist, wird -1 zurückgegeben, wenn die Präzision nicht verfügbar ist, -2, wenn der Exponentbereich nicht verfügbar ist und -3 wenn keine der Anforderungen stehen zur Verfügung. Wenn mehrere implementierte Typen die Bedingung erfüllen, wird diejenige mit der kleinsten Dezimalgenauigkeit zurückgegeben, und wenn mehrere davon vorhanden sind, wird diejenige mit der kleinsten Zahl zurückgegeben. Beispiele finden Sie in Kapitel 2 des Haupttextes. Beispiele für Arten in ein paar verschiedenen Implementierungen (NAG und Cray) sind in Anlage 6 angegeben. LOGIKAL (L, Art) wandelt zwischen verschiedenen Arten von logischen Variablen. Logische Variablen können auf verschiedene Weise implementiert werden, beispielsweise mit einer physikalischen Darstellung, die ein Bit (nicht empfohlen), ein Byte, ein Wort oder sogar ein Doppelwort belegt. Dieser Unterschied ist wichtig, wenn COMMON und EQUIVALENCE mit logischen Variablen in einem Programm in der traditionellen Weise der Fortran-66-Programmierung missbraucht wurden. 8. Numerische Abfragefunktionen: Diese Funktionen arbeiten mit einem bestimmten Modell von Integer - und Gleitkommarithmetik, siehe ISO (1991), Abschnitt 13.7.1. Die Funktionen geben Eigenschaften von Zahlen der gleichen Art wie die Variable X zurück. Die real und in einigen Fällen integer sein kann. Funktionen, die Eigenschaften des aktuellen Arguments X zurückgeben, sind in Abschnitt 12 unten, Fließkomma-Manipulationsfunktionen verfügbar. BITSIZE (I) liefert die Anzahl der Bits gemäß dem Modell der Bitdarstellung in der Norm ISO (1991), Abschnitt 13.5.7. Normalerweise erhalten wir die Anzahl der Bits in einem (ganzen) Wort. Das Modell für die Bitdarstellung in der Norm ISO (1991), Abschnitt 13.5.7 wird verwendet. TRANSFER (SOURCE, MOLD, size) legt fest, dass die physikalische Darstellung des ersten Arguments SOURCE so behandelt werden soll, als hätten sie Typ und Parameter als zweites Argument MOLD. Aber ohne es zu konvertieren. Der Zweck besteht darin, eine Möglichkeit zu geben, eine Menge eines bestimmten Typs über eine Routine zu verschieben, die nicht genau diesen Datentyp aufweist. 12. Fließkomma-Manipulationsfunktionen: Diese Funktionen arbeiten in einem bestimmten Modell von Integer - und Gleitkommarithmetik, siehe Norm ISO (1991), Abschnitt 13.7.1. Die Funktionen geben Zahlen zurück, die sich auf die tatsächliche Variable X des Typs REAL beziehen. Funktionen, die Eigenschaften für die Zahlen der gleichen Art wie die Variable X zurückgeben, sind unter Abschnitt 8 (Numerische Abfragefunktionen). DOTPRODUCT (VECTORA, VECTORB) bildet ein Skalarprodukt aus zwei Vektoren, die dieselbe Länge haben müssen (gleiche Anzahl von Elementen). Bitte beachten Sie, dass, wenn VECTORA vom Typ COMPLEX ist das Ergebnis SUM (CONJG (VECTORA) VECTORB). MATMUL (MATRIXA, MATRIXB) bildet das Matrixprodukt zweier Matrizen, die konsistent sein müssen, d. H. Die Dimensionen wie (M, K) und (K, N) haben. Wird in Kapitel 11 des Haupttextes verwendet. 14. Array-Funktionen: ALL (MASK, dim) gibt einen logischen Wert zurück, der angibt, ob alle Relationen in MASK. TRUE sind. . Nur die gewünschte Dimension, wenn das zweite Argument gegeben ist. ANY (MASK, dim) gibt einen logischen Wert zurück, der angibt, ob eine Relation in MASK. TRUE ist. . Nur die gewünschte Dimension, wenn das zweite Argument gegeben ist. COUNT (MASK, dim) gibt einen numerischen Wert zurück, der die Anzahl der Beziehungen in MASK ist, die. TRUE sind. . Nur die gewünschte Dimension, wenn das zweite Argument gegeben ist. MAXVAL (ARRAY, dim, mask) gibt den größten Wert im Array zurück. Von denen, die die Beziehung im dritten Argument MASK befolgen, wenn diese gegeben ist, nur entlang der gewünschten Dimension, wenn das zweite Argument DIM gegeben ist. MINVAL (ARRAY, dim, mask) gibt den kleinsten Wert im Array zurück. Von denen, die die Beziehung im dritten Argument MASK befolgen, wenn diese gegeben ist, nur entlang der gewünschten Dimension, wenn das zweite Argument DIM gegeben ist. PRODUCT (ARRAY, dim, mask) gibt das Produkt aller Elemente im Array zurück. Von denen, die die Beziehung im dritten Argument MASK befolgen, wenn diese gegeben ist, nur entlang der gewünschten Dimension, wenn das zweite Argument DIM gegeben ist. SUM (ARRAY, dim, mask) gibt die Summe aller Elemente im Array zurück. Von denen, die die Beziehung im dritten Argument MASK befolgen, wenn diese gegeben ist, nur entlang der gewünschten Dimension, wenn das zweite Argument DIM gegeben ist. Ein Beispiel ist in Anhang 3, Abschnitt 10 gegeben. ALLOCATED (ARRAY) ist eine logische Funktion, die angibt, ob das Array zugeordnet ist. LBOUND (ARRAY, dim) ist eine Funktion, die die untere Dimensionsgrenze für den ARRAY zurückgibt. Wenn DIM (die Dimension) nicht als Argument angegeben wird, erhalten Sie einen Integer-Vektor, wenn DIM enthalten ist, erhalten Sie den Integer-Wert mit genau diesem unteren Dimensionslimit, für das Sie gefragt haben. SHAPE (SOURCE) ist eine Funktion, die die Form eines Arrays SOURCE als Integer-Vektor zurückgibt. SIZE (ARRAY, dim) ist eine Funktion, die die Anzahl der Elemente in einem Array zurückgibt. Wenn DIM nicht angegeben ist, und die Anzahl der Elemente in der relevanten Dimension, wenn DIM enthalten ist. UBOUND (ARRAY, dim) ist eine Funktion ähnlich LBOUND, die die oberen Dimensionsgrenzen zurückgibt. MERGE (TSOURCE, FSOURCE, MASK) ist eine Funktion, die zwei Arrays verbindet. Es gibt die Elemente in TSOURCE, wenn die Bedingung in MASK ist. TRUE. Und FSOURCE, wenn die Bedingung in MASK. FALSE ist. Die beiden Felder TSOURCE und FSOURCE müssen vom gleichen Typ und der gleichen Form sein. Das Ergebnis ist auch diese Art und diese Form. Auch MASK muss die gleiche Form haben. Ich gebe hier ein ziemlich vollständiges Beispiel für die Verwendung von MERGE, das auch RESHAPE aus dem nächsten Abschnitt verwendet, um geeignete Testmatrizen zu bauen. Beachten Sie, dass die beiden Subroutinen WRITEARRAY und WRITELARRAY Testroutinen sind, um Matrizen zu schreiben, die im ersten Fall vom Typ REAL sind, im zweiten Fall vom Typ LOGICAL. Die folgende Ausgabe wird erhalten PACK (ARRAY, MASK, Vektor) packt ein Array an einen Vektor mit der Steuerung von MASK. Die Form des logischen Arrays MASK muss mit dem für ARRAY übereinstimmen oder MASK muss ein Skalar sein. Wenn VECTOR enthalten ist, muss es ein Array von Rang 1 (d. h. ein Vektor) mit mindestens so vielen Elementen sein, wie diejenigen, die in MASK wahr sind und denselben Typ wie ARRAY haben. Wenn MASK ein Skalar mit dem Wert. TRUE ist. Dann muss VECTOR die gleiche Anzahl von Elementen wie ARRAY haben. Das Ergebnis ist ein Vektor mit so vielen Elementen wie diejenigen in ARRAY, die den Bedingungen gehorchen, wenn VECTOR nicht enthalten ist (d. h. alle Elemente, wenn MASK ein Skalar mit dem Wert. TRUE ist). In dem anderen Fall ist die Anzahl der Elemente des Ergebnisses so viele wie in VEKTOR. Die Werte sind die zugelassenen, d. h. die Werte, die die Bedingung erfüllen, und werden in der gewöhnlichen Fortran-Reihenfolge sein. Wenn VECTOR enthalten ist und die Anzahl seiner Elemente die Anzahl der zugelassenen Werte übersteigt, werden die fehlenden Werte, die für das Ergebnis erforderlich sind, von den entsprechenden Stellen in VECTOR genommen. Das folgende Beispiel basiert auf der Modifikation des einen für MERGE. Aber ich gebe jetzt nur die Ergebnisse. SPREAD (SOURCE, DIM, NCOPIES) gibt ein Array des gleichen Typs wie das Argument SOURCE zurück, wobei der Rang um eins erhöht wird. Die Parameter DIM und NCOPIES sind ganzzahlig. Wenn NCOPIES negativ ist, wird stattdessen der Wert Null verwendet. Wenn SOURCE ein Skalar ist, wird SPREAD zu einem Vektor mit NCOPIES-Elementen, die alle denselben Wert wie SOURCE haben. Der Parameter DIM gibt an, welcher Index erweitert werden soll. Er muss im Bereich 1 und 1 liegen (Rang von SOURCE). Wenn SOURCE ein Skalar ist, dann muss DIM eins sein. Der Parameter NCOPIES ist die Anzahl der Elemente in den neuen Dimensionen. Zusätzliche Diskussion findet sich in der Lösung der Übung (11.1). UNPACK (VECTOR, MASK, ARRAY) streut einen Vektor zu einem Array unter der Kontrolle von MASK. Die Form des logischen Arrays MASK muss mit dem für ARRAY übereinstimmen. Das Array VECTOR muß den Rang 1 haben (d. h. es ist ein Vektor) mit mindestens so vielen Elementen wie diejenigen, die in MASK wahr sind. Und muss auch den gleichen Typ wie ARRAY haben. Wenn ARRAY als Skalar angegeben wird, wird es als ein Array mit der gleichen Form wie MASK und den gleichen skalaren Elementen betrachtet. Das Ergebnis ist ein Array mit der gleichen Form wie MASK und demselben Typ wie VECTOR. Die Werte sind diejenigen von VECTOR, die akzeptiert werden (d. h. diejenigen, die die Bedingung in MASK erfüllen), genommen in der gewöhnlichen Fortran-Reihenfolge, während in den verbleibenden Positionen in ARRAY die alten Werte beibehalten werden. RESHAPE (SOURCE, SHAPE, pad, order) konstruiert ein Array mit einer bestimmten Form SHAPE ausgehend von den Elementen in einem gegebenen Array SOURCE. Wenn PAD nicht enthalten ist, dann muss die Größe von SOURCE mindestens PRODUCT (SHAPE) sein. Wenn PAD enthalten ist, muss es den gleichen Typ wie SOURCE haben. Wenn ORDER enthalten ist, muss es ein INTEGER-Array mit der gleichen Form wie SHAPE sein und die Werte müssen eine Permutation von (1,2,3 N) sein, wobei N die Anzahl der Elemente in SHAPE ist. Muss es kleiner oder gleich 7 sein. Das Ergebnis hat natürlich eine Form SHAPE und die Elemente sind die in SOURCE. Möglicherweise ergänzt mit PAD. Die verschiedenen Dimensionen wurden bei der Zuordnung der Elemente permutiert, wenn ORDER eingefügt wurde, ohne jedoch die Form des Ergebnisses zu beeinflussen. Einige einfache Beispiele sind im vorigen und im nächsten Abschnitt sowie im Anhang 3, Abschnitt 9 aufgeführt. Ein komplizierteres Beispiel, das auch die optionalen Argumente veranschaulicht, folgt. Die Ausgabe des obigen Programms ist wie folgt. Die Shift-Funktionen geben die Form eines Arrays unverändert zurück, bewegen aber die Elemente. Sie sind ziemlich schwierig zu erklären, so empfehle ich, auch die Norm ISO (1991) zu studieren. CSHIFT (ARRAY, SHIFT, dim) führt durch SHIFT-Positionen nach links, wenn SHIFT positiv und nach rechts, wenn es negativ ist. Wenn ARRAY ein Vektor ist, wird die Verschiebung auf natürliche Weise durchgeführt, wenn es ein Array mit höherem Rang ist, dann ist die Verschiebung in allen Abschnitten entlang der Dimension DIM. Wenn DIM fehlt, wird es als 1 betrachtet, in anderen Fällen muss es eine skalare ganze Zahl zwischen 1 und n sein (wobei n dem Rang von ARRAY entspricht). Das Argument SHIFT ist eine skalare Ganzzahl oder ein Integer-Array vom Rang n-1 und die gleiche Form wie das ARRAY. Außer entlang der Dimension DIM (die wegen des unteren Ranges entfernt wird). Verschiedene Abschnitte können daher in verschiedenen Richtungen und mit verschiedenen Stellungen verschoben werden. EOSHIFT (ARRAY, SHIFT, boundary, dim) führt nach links, wenn SHIFT positiv und nach rechts, wenn es negativ ist. Anstelle der ausgeschobenen Elemente werden neue Elemente aus BOUNDARY genommen. Wenn ARRAY ein Vektor ist, wird die Verschiebung auf natürliche Weise durchgeführt, wenn es sich um ein Array höherer Ordnung handelt, ist die Verschiebung auf allen Abschnitten entlang der Dimension DIM. Wenn DIM fehlt, wird es als 1 betrachtet, in anderen Fällen muss es einen skalaren Integerwert zwischen 1 und n haben (wobei n dem Rang von ARRAY entspricht). Das Argument SHIFT ist eine skalare Ganzzahl, wenn ARRAY den Rang 1 hat. Im anderen Fall kann es sich um eine skalare Ganzzahl oder ein ganzzahliges Array mit dem Rang n-1 und mit derselben Form wie das Array ARRAY handeln Wegen des niedrigeren Ranges). Entsprechendes gilt für BOUNDARY, das den gleichen Typ wie das ARRAY haben muss. Wenn der Parameter BOUNDARY fehlt, haben Sie die Wahl der Werte Null,.FALSE. Oder Leerzeichen, abhängig vom Datentyp. Verschiedene Abschnitte können somit in verschiedenen Richtungen und mit verschiedenen Stellungen verschoben werden. Ein einfaches Beispiel für die beiden obigen Funktionen für den Vektorfall folgt sowohl dem Programm als auch dem Ausgang. Es folgt ein einfaches Beispiel für die beiden obigen Funktionen im Matrixfall. Ich habe hier RESHAPE verwendet, um eine geeignete Matrix zu erstellen, um mit der Arbeit zu beginnen. Das Programm wird hier nicht wiedergegeben, sondern nur die Hauptaussagen. TRANSPOSE (MATRIX) transponiert eine Matrix, die ein Array von Rang 2 ist. Es ersetzt die Zeilen und Spalten in der Matrix. MAXLOC (ARRAY, mask) gibt die Position des größten Elements im Array zurück. Wenn MASK nur für diejenigen enthalten ist, die die Bedingungen in MASK erfüllen. Das Ergebnis ist ein Integer-Vektor Es wird in der Lösung der Übung (11.1) verwendet. MINLOC (ARRAY, mask) gibt die Position des kleinsten Elements im Array zurück. Wenn MASK nur für diejenigen enthalten ist, die die Bedingungen in MASK erfüllen. Das Ergebnis ist ein Integer-Vektor ASSOCIATED (POINTER, target) ist eine logische Funktion, die angibt, ob der Zeiger POINTER mit einem Ziel verknüpft ist und wenn ein bestimmter TARGET enthalten ist, gibt er an, ob er mit genau diesem Ziel verknüpft ist. Wenn sowohl POINTER als auch TARGET Zeiger sind, ist das Ergebnis. TRUE. Nur wenn beide mit demselben Ziel verknüpft sind. Ich verweise den Leser auf Kapitel 12 des Haupttextes, Zeiger. Eine Subroutine, die das Datum, die Zeit und die Zeitzone zurückgibt. Mindestens ein Argument muss gegeben werden. DATE muss eine skalare Zeichenfolgenvariable mit mindestens 8 Zeichen sein und dem Wert CCYYMMDD für Jahrhundert, Jahr, Monat und Tag zugewiesen werden. Alle werden numerisch mit Leerzeichen angegeben, wenn das System das Datum nicht enthält. ZEIT muss auch eine skalare Zeichenkettenvariable mit mindestens 10 Zeichen sein und ihr wird ein Wert hhmmss. sss für die Zeit in Stunden, Minuten, Sekunden und Millisekunden zugewiesen. Alle werden numerisch mit Leerzeichen angegeben, wenn das System keine Uhr enthält. ZONE muss eine skalare Zeichenfolgenvariable mit mindestens 5 Zeichen sein und dem Wert hhmm für Vorzeichen, Zeit in Stunden und Minuten für die lokale Zeitdifferenz mit UTC (die zuvor Greenwich Mean Time genannt wurde) zugeordnet. Alle werden numerisch mit Leerzeichen angegeben, wenn das System keine Uhr enthält. In Schweden erhalten wir also 0100 im Winter und 0200 im Sommer, in Nowosibirsk bekommen wir 0700. Die Variable VALUES ist stattdessen ein Integer-Vektor mit mindestens 8 Elementen, der einfachste Weg, die Ergebnisse von DATEANDTIME bei den Berechnungen in einem Programm zu verwenden. Wenn das System nicht das Datum oder die Zeit, die Sie den Wert - HUGE (0). Das ist die kleinste ganze Zahl im Modell, als Ausgang. Der Vektor enthält die folgenden Elemente: Jahr, Monat, Tag, Zeitdifferenz in Minuten. Stunden, Minuten, Sekunden und Millisekunden. Subroutine, die die Systemzeit zurückgibt. Mindestens ein Argument muss gegeben werden. COUNT ist eine skalare Ganzzahl, die für jeden Zyklus bis zu COUNTMAX um eins erhöht wird. Wo es wieder anfängt. Wenn keine Systemuhr vorhanden ist, wird - HUGE (0) zurückgegeben. COUNTRATE ist eine skalare Ganzzahl, die die Anzahl der Zyklen pro Sekunde angibt. Ist keine Systemuhr vorhanden, wird der Wert Null zurückgegeben. COUNTMAX ist eine skalare Ganzzahl, die den maximalen Wert angibt, den COUNT erreichen kann. Wenn keine Systemuhr vorhanden ist, wird stattdessen Null zurückgegeben. Eine Unterroutine, die die Folge von Bits in Position FROMPOS kopiert und die Länge LEN zum Ziel TO hat, die in Position TOPOS startet. Die verbleibenden Bits werden nicht geändert. Alle Mengen müssen ganze Zahlen sein und alle außer TO müssen INTENT (IN) haben, während TO soll INTENT (INOUT) haben und vom gleichen Typ wie FROM sein. Die gleiche Variable kann FROM und TO sein. Einige natürliche Einschränkungen gelten für die Werte von LEN, FROMPOS und TOPOS und Sie müssen auch den Wert von BITSIZE berücksichtigen. Aus einem Startwert, der als Integer-Vektor gespeichert ist, kann eine Folge von Pseudozufallszahlen erzeugt werden. Die Subroutinen bieten eine tragbare Schnittstelle zu einer implementierungsabhängigen Zufallszahlenfolge. Diese Subroutine gibt in der Gleitkommazahl Variable HARVEST eine (oder mehrere, wenn HARVEST ein Array ist) Zufallszahlen zwischen 0 und 1. Diese Subroutine setzt den Zufallszahlengenerator zurück oder gibt Auskunft darüber. Es sind keine Argumente vorzusehen. Die Ausgangsvariable SIZE muss eine skalare Integerzahl sein und die Anzahl der Integer (N) geben, die der Prozessor für den Startwert verwendet. Die Eingangsgröße PUT ist ein ganzzahliger Vektor, der die vom Anwender gelieferten Startnummern in den Zufallszahlengenerator setzt. Die Ausgangsgröße GET (auch ein Integer-Vektor) liest den aktuellen Startwert. Beispiel: Ein einfaches Beispiel für die Verwendung dieser Funktionen ist jetzt verfügbar. Einführung in Fortran Intrinsic Functions Zuweisung: Lesen Sie Kapitel 4 und Beispiel trig. f. Start Homework 4, Due 1/31 Lange bevor es wissenschaftliche Taschenrechner, Wissenschaftler und Ingenieure erkannten, dass sie einfache Wege, um Ergebnisse von gemeinsamen Funktionen wie Sinus, Kosinus, natürlicher Logarithmus und vieles mehr zu erhalten brauchten. Diese Bedürfnisse wurden mit jedem Fortran-Standard berücksichtigt, was zu einer langen Liste von eingebauten Funktionen (intrinsische Funktionen), um Ihr Leben zu erleichtern. Ich werde nicht alle Funktionen in der aktuellen Norm (Fortran 90), sondern gibt Ihnen einige wichtige in diesem und späteren Diskussionen. Die Syntax für die Verwendung von intrinsischen Funktionen kann Ihnen sehr vertraut sein, da sie auch in Spreadsheets erscheinen. Wenn ich die Grße einer Geschwindigkeit in Kasten A1 und den Winkel zwischen der Geschwindigkeit und der x-Achse (im Bogenmaß) in Kasten A2 eingebe, kann ich die x-Komponente der Geschwindigkeit in Kasten A3 mit der Formel A1COS ( A2). In Fortran könnte dieses Ergebnis mit einer Zuweisungsanweisung wie velxvelcos (angrad) erhalten werden. Bevor wir weitergehen, brauchen wir eine einfache Definition. Im obigen Beispiel ist angrad ein Argument der Funktion cos. Some Basisintrinsische Funktionen abs (x) - Absoluter Wert von x iabs (I) - Absoluter Wert einer ganzen Zahl I (vor-90 Fortran abs hat keine ganzzahligen Argumente.) Sin (X) - Liefert den Sinus von x (x ist keine Ganzzahl) cos (x) - Liefert den Cosinus von x (x ist keine Ganzzahl) tan (x) - Liefert den Tangens von x Exp (x) - Berechnet den natürlichen Logarithmus von x (x ist keine ganze Zahl und gt 0) log10 (x) - berechnet die Basis. (X ist nicht eine ganze Zahl) log (x) - berechnet e (2.7183) Logarithm von x (x ist keine ganze Zahl und gt 0) asin (x) - Liefert den arcsine (inversen Sinus) von x (x ist real) acos (x) - Liefert den Arkusinus (inverser Cosinus) von x (x ist (X) - Gibt die Quadratwurzel von x zurück (x ist keine ganze Zahl und gt 0) nint (x) - Liefert den nächsten Knoten Integer zur reellen Zahl x min (x1, x2) - Gibt das Minimum von x1, x2 zurück. (Argumente müssen vom selben Typ sein) max (x1, x2) - Gibt das Maximum von x1, x2 zurück. (Argumente müssen vom gleichen Typ sein) Die Max - und Min-Funktionen sind ungewöhnlich, da sie eine beliebige Anzahl von Argumenten annehmen. Die generischen Formulare min und max waren nicht ein zwingendes Teil des Fortran 77-Standards, sondern befinden sich in Fortran 90. In vielen Fortran-77-Codes sehen Sie Funktionen: amax1 (x1, x2) - Liefert das Maximum von x1, x2. Als reelle Zahl (Argumente sind real) amax0 (i1, i2) - Gibt das Maximum von i1, i2 zurück. Als reelle Zahl (Argumente sind ganzzahlig) max0 (i1, i2.) - Liefert das Maximum von i1, i2. Als Ganzzahl (Argumente sind Integer) max1 (x1, x2.) - Liefert das Maximum von x1, x2. Als Integer (Argumente sind real) Ähnliche Formen erschienen für min. Darüber hinaus sind log und log10 optionale Formulare in Fortran 77. Ältere Programme verwenden oft alog und alog10, um den Funktionsnamen mit einem Buchstabencharakteristikum eines echten anstatt eines ganzzahligen Wertes zu starten. Im Allgemeinen war Fortran 77 davon abhängig, dass Sie speziell eine Funktion auswählen, die für die Argumenttypen und die Art des zurückzugebenden Wertes geeignet ist. Während zum Thema Fortran 90 intrinsische Funktionen, ist es wert, zwei, die Sie in den Beispielbereichen gesehen haben, zu bemerken. Und eine verwandte Funktion, die in Programmen, die auf einer Reihe von Maschinen. (X) - Gibt die kleinste positive Zahl zurück, die auf dem aktuellen Computer für ein reales Argument dargestellt werden kann x Riesige (x) - Gibt die größte positive Zahl zurück, die auf dem aktuellen Computer für das reelle Argument x precision (x) - Returns dargestellt werden kann Die auf dem aktuellen Rechner für das reale Argument zur Verfügung steht x Einige Kommentare zur Geschwindigkeit Sie müssen erkennen, dass trigonometrische, log und exp intrinsische Funktionen relativ teuer sind in Bezug auf die benötigte Zeit. Wenn Sie den Wert von sin (0.1) häufig benötigen, verwenden Sie die Funktion einmal in einer Zuordnung wie: sin0p1 sin (0.1) und verwenden dann die neue Variable sin0p1, wo sin (0.1) benötigt wird. Die hohen Kosten von exp und log werden ebenfalls berücksichtigt In der Benutzung des Bedieners. Normalerweise führt ein Ausdruck wie xy dazu, dass der Compiler Code entsprechend exp (ylog (x)) einfügt. Allerdings sind die meisten Compiler intelligent genug zu erkennen, dass, wenn y eine Ganzzahl ist, können sie eine oder mehrere Multiplikationen (x2xx, x3xxx, etc.). Solche Compiler enthalten die Logik, um den Break-Even-Punkt, ausgedrückt als Größe von y, zwischen einer solchen Multiplikation und der Kombination von exp und log zu kennen. Es ist immer schneller zu programmieren x2 als x2.0, also seien Sie vorsichtig in Ihrer Wahl der Typen für Exponenten. Geschwindigkeit ist auch ein Faktor in der Existenz der sqrt intrinsic Funktion. Dies ist ein spezieller Algorithmus für die Berechnung der Quadratwurzel einer Zahl, die immer schneller als die Erhöhung der Zahl auf die 0,5 Leistung ist. Wenn die Option existiert, verwenden Sie sqrt (x) anstatt x0.5. Nach meiner Erfahrung ist sqrt (sqrt (x)) schneller als x0.25. Während wir auf dem Thema Geschwindigkeit sind, sollten wir die relative Geschwindigkeit der anderen Operationen überprüfen. Hinzufügen und Subtrahieren sind immer am schnellsten. Multiplizieren kommt an zweiter Stelle. Divide ist langsamer als multiplizieren, aber deutlich schneller als sqrt. Wenn Sie sich durch eine Variable x häufig (mehr als 2 oder 3 Mal) teilen, ist es eine gute Idee, eine andere Variable zu definieren, die rx mit der Gleichung rx1./x bezeichnet, dann multiplizieren Sie mit rx, wo Sie durch x dividiert haben würden . Ein Beispielprogramm mit intrinsischen Funktionen Starten Sie das Beispielprogramm trig. f für Beispiele für intrinsische Funktionen und als nützlichen Beginn für Ihre aktuelle Hausaufgabe. Testen Sie Ihr Wissen zu diesem Material mit einigen Überprüfung Fragen. Up one level / HomeFortran Jobs Die Nachfrage Trend der Stellenanzeigen zitiert Fortran als Anteil aller IT-Jobs mit einem Spiel in der Kategorie Programmiersprachen. Fortran Salary Trend Diese Grafik zeigt die 3-Monats-gleitenden Durchschnitt für Gehälter zitiert in dauerhafte IT-Arbeitsplätze zitiert Fortran in Großbritannien. Fortran Gehalt Histogramm Diese Grafik bietet ein Gehalt Histogramm für IT-Arbeitsplätze zitiert Fortran über die 3 Monate bis 13 Dezember 2016 in Großbritannien. Fortran Top 19 Job Locations Die folgende Tabelle zeigt die Nachfrage und stellt einen Leitfaden für die in den IT-Jobs zitierten mittleren Gehälter dar, die Fortran innerhalb des Vereinigten Königreichs in den drei Monaten bis zum 13. Dezember 2016 zitieren. Die Spalte Rangänderung gibt Anzeichen für die Veränderung der Nachfrage Innerhalb jedes Standortes auf der Grundlage der gleichen 3 Monate Zeitraum im vergangenen Jahr. Rank Änderung auf die gleiche Zeit Letztes Jahr Matching Permanent IT Job-Anzeigen Median Gehalt Letzte 3 Monate
No comments:
Post a Comment