Versuchen Sie, das Programm "FORTRAN77 Numerical Computing Programming" auf C und Python zu portieren (Teil 1).

Einführung

Ich habe lange Zeit als App-Entwicklungsingenieur gelebt, aber als ich mich fragte, ob ich in der aktuellen Saison etwas ausprobieren oder Mathematik studieren sollte. Ich bemerkte es plötzlich. Ich hatte ursprünglich Mathematik in dem Fach, das ich belegte, also hätte ich es an dieser Universität machen sollen. Künstliche Intelligenz, Mustererkennung usw. Ich habe es völlig vergessen. Also zog ich dies zuerst aus den verschiedenen Texten heraus, die ich hinterlassen hatte. Programmierung numerischer Berechnungen

Erstausgabe Mai 1986. Als ich die numerische Berechnungsprogrammierung googelte, war es ein Buch, das nach 33 Jahren immer noch ein Hit war. Es gibt nicht viele solche Bücher.

Vorerst werde ich versuchen, den Code in diesem Buch nach der Überprüfung auf C und Python zu portieren. Insgesamt gibt es 32, aber ich werde es ruhig angehen lassen.

Danach wird der ausgegebene Code in Visual Studio Code auf dem Mac geschrieben. Fortran und C werden mit gcc kompiliert.

Erzeugung von Computer-Epsilon

Rundungsfehler

Zusammenfassung von Kapitel 1, S. 4-5. Die Zahlen im Programm sind grundsätzlich abgeschnitten oder gerundet. Der durch das Abschneiden oder Runden verursachte Fehler wird als ** Rundungsfehler ** bezeichnet. Die Obergrenze des relativen Fehlers, der beim Abschneiden auf einen β-ary n-stelligen Gleitkomma auftritt, ist

\frac{\beta^{-n}}{\beta^{-1}} = \beta^{-(n-1)}

Maximaler Rundungsfehler relativ zu diesem 1

\epsilon_M = \beta^{-(n-1)}

Ist ein Wert, der für das verwendete Gleitkommasystem spezifisch ist und als ** Maschinen-Epsilon ** bezeichnet wird. Dieser Wert ist

1\oplus\epsilon_M> 1 \tag{1}

Kann auch als die kleinste positive Gleitkommazahl definiert werden, die erfüllt. $ \ Oplus $ bedeutet, dass nach dem Hinzufügen eine Kürzungs- oder Rundungsoperation ausgeführt wird.

Fortran-Code

Fortran-Programm basierend auf der Definition von (1).

maceps.f


      SUBROUTINE MACEPS(EPSMAC)
        EPSMAC = 1.0
100    CONTINUE
       IF (1.0 + EPSMAC .LE. 1.0) THEN
        EPSMAC = 2 * EPSMAC
        RETURN
       END IF
       EPSMAC = EPSMAC * 0.5
       GO TO 100
      END 
    
      program maceps_main
        call maceps(epsmac)
        write(*,*)epsmac
      end program maceps_main

Der Code im Buch war nur der Unterprogrammteil, daher wurde der Hauptteil (untere 4 Zeilen) hinzugefügt. Der Kleinbuchstabe ist der Code, den ich hinzugefügt habe, und der Großbuchstabe ist das Buch (Fortran unterscheidet nicht zwischen Groß- und Kleinschreibung).

Das Ausführungsergebnis ist

   1.19209290E-07

Wird sein.

Den Code verstehen

Plötzlich ist es eine GO TO-Anweisung aus dem ersten Code. Nein, es kann nicht geholfen werden. Der Autor (verstorben) ist ein großartiger Lehrer für numerische Analyse, kein Ingenieur. Lassen Sie es uns vorerst im Flussdiagramm wecken. maceps_flowchart1.png

Jep. Wenn ein Neuling einen solchen Fluss bringt, wird er vorerst toben.

Deshalb habe ich das Flussdiagramm umgeschrieben. maceps_flowchart2.png

In den Grundlagen des JIS-Flussdiagramms ist die Schleifenbedingung die Endbedingung, aber in C und Python, die von nun an portiert werden sollen, ist die Schleifenbedingung die Fortsetzungsbedingung, also in dieser Form.

C-Code

maceps.c


#include <stdio.h>
#include <float.h>

void maceps(float *epsmac){
    *epsmac = 1.0f;
    while((1.0f + *epsmac) > 1.0f)
    {
        *epsmac *= 0.5;
    }
    *epsmac *=2;
}

int main(void){
    float epsmac;

    maceps(&epsmac);

    printf("%.8E\n", epsmac);
    printf("%.8E\n", FLT_EPSILON);

    return 0;
}

Da der Fortran-Code ein Gleitkomma mit einfacher Genauigkeit ist, verwenden wir auch Gleitkomma in C. Ich wollte es mit dem grundlegenden Fortran-Code abgleichen, also habe ich Variablen vom Main mit einem Zeiger übergeben und im Main angezeigt.   In C wird das Computer-Epsilon durch eine Konstante in float.h definiert, daher habe ich auch das (FLT_EPSILON) im Main angezeigt.

Das Ausführungsergebnis ist

1.19209290E-07
1.19209290E-07

Wird sein.

Python-Code

maceps.py


import numpy as np
def maceps(epsmac):
    epsmac[0] = 1.0
    epsmac[1] = 1.0
    while epsmac[1]+epsmac[0] > epsmac[1]:
        epsmac[0] = epsmac[0] * 0.5
    epsmac[0] = epsmac[0] * 2    
    return

epsmac = np.array([0,0],dtype=np.float32)

maceps(epsmac)

print("%.8E" % epsmac[0])
print("%.8E" % np.finfo(np.float32).eps)

Python-Standard-Gleitkommazahlen haben eine doppelte Genauigkeit. Verwenden Sie daher numpy, um Gleitkommazahlen mit einfacher Genauigkeit zu entsprechen. Und da Computer-Epsilon sowohl in Numpy als auch in C definiert ist, wird dies auch angezeigt.

Das Ausführungsergebnis ist

1.19209290E-07
1.19209290E-07

ist. Dieser Code, @konandoiruasa, wies in einem Kommentar darauf hin, dass "wenn es eine Operation mit einer Konstanten gibt, es float64 sein wird". Vielen Dank. Bitte beziehen Sie sich auf das Mittel.

Zusammenfassung

EPSMAC wird während der Wiederholung in zwei Hälften geteilt (= multipliziert mit 0,5). Die für die Wiederholungsbedingung verwendete Formel: 1.0 + EPSMAC > 1.0 Wenn dies nicht zutrifft, ist der Wert vor der letzten Division der Mindestwert, der dies erfüllt. Hören Sie also auf zu wiederholen und verdoppeln Sie, um die letzte Division abzubrechen. Das heißt, der minimale positive Wert, der die Formel (1) erfüllt = die Differenz zwischen der minimalen Anzahl größer als 1 und 1 = Computer-Epsilon.

Recommended Posts

Versuchen Sie, das Programm "FORTRAN77 Numerical Computing Programming" auf C und Python zu portieren (Teil 1).
Versuchen Sie, das Programm "FORTRAN77 Numerical Computing Programming" auf C und Python zu portieren (Teil 3).
Versuchen Sie, das Programm "FORTRAN77 Numerical Computing Programming" auf C und Python zu portieren (Teil 2).
Versuchen Sie, das Programmier-Herausforderungsbuch mit Python3 zu lösen
[Einführung in Python3 Tag 1] Programmierung und Python
[Einführung in Python] Ich habe die Namenskonventionen von C # und Python verglichen.
Schreiben Sie ein Programm, das das Programm missbraucht und 100 E-Mails sendet
Der Versuch, Segmentbäume Schritt für Schritt zu implementieren und zu verstehen (Python)
Setzen Sie Cabocha 0.68 in Windows ein und versuchen Sie, die Abhängigkeit mit Python zu analysieren
C-Sprache zum Anzeigen und Erinnern Teil 2 Rufen Sie die C-Sprache aus der Python-Zeichenfolge (Argument) auf
C-Sprache zum Sehen und Erinnern Teil 1 Rufen Sie die C-Sprache aus Python auf (Hallo Welt)
Portieren und Ändern des Doublet-Solvers von Python2 auf Python3.
Versuchen Sie, Python-Code zu schreiben, um Go-Code zu generieren. - Versuchen Sie, JSON-to-Go usw. zu portieren
Python Amateur versucht die Liste zusammenzufassen ①
C-Sprache zum Anzeigen und Erinnern Teil 4 Rufen Sie die C-Sprache von Python (Argument) double auf
C-Sprache zum Anzeigen und Erinnern Teil 5 Rufen Sie die C-Sprache aus dem Python-Array (Argument) auf
C-Sprache zum Sehen und Erinnern Teil 3 Rufen Sie die C-Sprache aus Python auf (Argument) c = a + b
Verwendung der C-Bibliothek in Python
So generieren Sie eine Sequenz in Python und C ++
Versuchen Sie, das Problem der Python-Klassenvererbung zu lösen
Versuchen Sie, das Mensch-Maschine-Diagramm mit Python zu lösen
Versuchen Sie es mit dem Python-Webframework Tornado Part 1
Versuchen Sie es mit dem Python-Webframework Tornado Part 2
"Cython" -Tutorial, um Python explosiv zu machen: Übergeben Sie das C ++ - Klassenobjekt an das Klassenobjekt auf der Python-Seite. Teil 2
Die Geschichte der Portierung von Code von C nach Go (und zur Sprachspezifikation)
Überlegen Sie, wie Sie Python auf Ihrem iPad programmieren können
Versuchen Sie, ein Python-Modul in C-Sprache zu erstellen
[Python] Versuchen Sie, die coole Antwort auf das FizzBuzz-Problem zu lesen
Stellen wir uns den Raum mit Raspeltorte vor, Teil 1
Versuchen Sie, das Problem der Zuweisung von Schulungsärzten mit Python zu lösen
Probieren Sie die DB-Operation mit Python aus und visualisieren Sie sie mit d3
Versuchen Sie, Python mit pybind11 in ein C ++ - Programm einzubetten
Tipps und Vorsichtsmaßnahmen beim Portieren von MATLAB-Programmen nach Python
Python Gibt die Funktion an, die ausgeführt werden soll, wenn das Programm endet
Ich hatte das Gefühl, dass ich den Python-Code nach C ++ 98 portiert habe.
Wie man Python auf Android genießt !! Programmieren für unterwegs !!
Gehen Sie in die Sprache, um Teil 7 C in der Sprache GO zu sehen und sich daran zu erinnern
[C / C ++] Übergeben Sie den in C / C ++ berechneten Wert an eine Python-Funktion, um den Prozess auszuführen, und verwenden Sie diesen Wert in C / C ++.
"Cython" -Tutorial, um Python explosiv zu machen: Übergeben Sie ein C ++ - Klassenobjekt an ein Klassenobjekt auf der Python-Seite. Teil ①
So starten Sie den PC jeden Morgen zu einer festgelegten Zeit und führen das Python-Programm aus
Versuchen Sie, in die Datenbank zu importieren, indem Sie ShapeFile mit numerischen Informationen zum nationalen Land mit Python bearbeiten
Eine Geschichte über die Portierung des Codes "Versuchen Sie zu verstehen, wie Linux funktioniert" nach Rust
[Python] Ein Programm, um die Anzahl der Äpfel und Orangen zu ermitteln, die geerntet werden können
[Einführung in cx_Oracle] (Teil 6) Zuordnung von DB- und Python-Datentypen
Versuchen Sie es mit GUI, PyQt in Python
Versuchen Sie, mit Python schnell und einfach auf die Twitter-API zuzugreifen
Versuchen Sie, die Funktionsliste des Python> os-Pakets abzurufen
Ich wollte den Panasonic Programming Contest 2020 mit Python lösen
Versuchen Sie, über XML RPC eine Verbindung zu Supervisord herzustellen, um das Programm zu starten / zu stoppen
Lassen Sie uns das Ausführungsergebnis des Programms mit C ++, Java, Python messen.
Schreiben Sie ein Python-Programm, um die Bearbeitungsentfernung [Python] [Levenshtein-Entfernung] zu ermitteln.
Überlegen Sie, ob das Programmieren in Python und C ein Anime war
[Teil 2] Crawlen mit Python! Klicken Sie auf die Webseite, um sich zu bewegen!
Ich habe versucht, die Zeit und die Zeit der C-Sprache zu veranschaulichen
Versuchen Sie, ein Unterfenster mit PyQt5 und Python zu öffnen
Erstellen Sie eine Python-Umgebung und übertragen Sie Daten auf den Server
Ich habe versucht, den Chi-Quadrat-Test in Python und Java zu programmieren.
Versuchen Sie, den Betrieb von Netzwerkgeräten mit Python zu automatisieren
Lösen mit Ruby und Python AtCoder ABC011 C Dynamische Planungsmethode
Ich möchte die Natur von Python und Pip kennenlernen
Ich habe versucht, die Unterschiede zwischen Java und Python aufzuzählen