Ich würde gerne einen guten Weg kennen, um zu überprüfen, ob eine Zahl x ein Rational ist (zwei ganze Zahlen n, m existieren, so dass x = n / m) in Python.
In Mathematik geschieht dies durch die Funktion
%Vor%Ich nehme an, diese Frage hat eine Antwort für eine gegebene Genauigkeit. Gibt es einen gemeinsamen Algorithmus, um diese beiden Ganzzahlen zu erhalten?
In python & gt; = 2.6 gibt es eine Methode as_integer_ratio
auf floats:
Aufgrund der Art und Weise wie Floats in Programmiersprachen definiert sind gibt es keine irrationalen Zahlen .
Die Art der Fließkommazahlen bedeutet, dass es keinen Sinn macht, zu prüfen , wenn eine Fließkommazahl rational ist, da alle Fließkommazahlen tatsächlich Bruchteile der Form n sind / 2 e . Vielleicht möchten Sie jedoch wissen, ob es einen einfachen Bruch gibt (einen mit einem kleinen Nenner statt einer großen Potenz von 2), der einer bestimmten Gleitkommazahl sehr nahe kommt.
Donald Knuth diskutiert das letztere Problem in Die Kunst der Computerprogrammierung Band II. Siehe die Antwort zu Übung 4.53-39. Die Idee ist, nach dem Bruchteil mit dem kleinsten Nenner in einem Bereich zu suchen, indem die Endpunkte des Bereichs als fortlaufende Brüche erweitert werden, solange ihre Koeffizienten gleich sind, und wenn sie sich voneinander unterscheiden, den einfachsten Wert zwischen ihnen annehmen. Hier ist eine ziemlich einfache Implementierung in Python:
%Vor%Und hier sind einige Ergebnisse:
%Vor%Vielleicht ist das für Sie interessant: Beste rationale Annäherung
Python verwendet Fließkommadarstellung anstelle von rationalen Zahlen. Sehen Sie sich die Standardbibliothek fractions
für einige Details zu rationalen Zahlen an.
Beachten Sie zum Beispiel, um zu sehen, warum es schief geht:
%Vor%(Oh, wollen Sie einen Fall sehen, wo es funktioniert?)
%Vor%Wie Sie festgestellt haben, kann eine Gleitkommazahl in eine rationale Zahl umgewandelt werden, indem der Dezimalpunkt verschoben und durch die entsprechende Zehnerpotenz dividiert wird.
Sie können dann den größten gemeinsamen Teiler aus dem Dividend und Divisor entfernen und prüfen, ob diese beiden Zahlen in den Datentyp Ihrer Wahl passen.
Das Problem mit reellen Zahlen in Programmiersprachen ist, dass sie normalerweise als Funktionen definiert sind, die bei gegebener Genauigkeit eine endliche Darstellung zurückgeben (zB eine Funktion, die n als Argument nimmt und eine Gleitkommazahl innerhalb von 2 ^ -n Genauigkeit liefert) .
Sie können eine rationale / ganze Zahl auf jeden Fall in eine reelle Zahl umwandeln, aber sogar ein Vergleich von Realen für die Gleichheit ist unentscheidbar (es ist im Wesentlichen das Halteproblem).
Man kann nicht sagen, ob eine reelle Zahl x rational ist: selbst in der Mathematik ist es normalerweise schwierig, da man p und q so finden muss, dass x = p / q, und dies ist oft nicht konstruktiv.
Bei einem Genauigkeitsfenster können Sie jedoch die "beste" rationale Näherung für diese Genauigkeit finden, indem Sie beispielsweise die kontinuierliche Bruchdehnung verwenden. Ich glaube, das ist im Wesentlichen was Mathematica macht. Aber in Ihrem Beispiel ist 6.75 bereits rational. Versuchen Sie stattdessen mit Pi.
Tags und Links python algorithm math floating-point