Überprüfen Sie, ob eine Zahl in Python rational ist

7

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?

    
Mermoz 24.11.2010, 12:27
quelle

7 Antworten

13

In python & gt; = 2.6 gibt es eine Methode as_integer_ratio auf floats:

%Vor%

Aufgrund der Art und Weise wie Floats in Programmiersprachen definiert sind gibt es keine irrationalen Zahlen .

    
SilentGhost 24.11.2010, 12:36
quelle
8

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%     
Gareth Rees 24.11.2010 12:53
quelle
5

Jede Zahl mit einer endlichen Dezimal-Erweiterung ist eine rationale Zahl. Sie könnten zum Beispiel immer lösen

%Vor%

indem Sie sagen, dass es

entspricht %Vor%

Da Floats und Doubles eine endliche Genauigkeit haben, sind sie alle rationale.

    
aioobe 24.11.2010 12:31
quelle
4

Vielleicht ist das für Sie interessant: Beste rationale Annäherung

    
alpha-mouse 24.11.2010 12:30
quelle
4

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%     
Chris Morgan 24.11.2010 12:38
quelle
1

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.

    
Andreas Brinck 24.11.2010 12:32
quelle
0

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.

    
Alexandre C. 24.11.2010 12:45
quelle