Rational numbers sind Brüche mit einer Ganzzahl als Zähler, geteilt durch eine Ganzzahl als Nenner.
Zum Beispiel können wir 2//3 als exakten Bruch speichern, anstatt als den ungefähren Float64-Wert 0.6666...
Der Vorteil ist, dass (außer im Extremfall des Ganzzahlüberlaufs) eine rationale Zahl exakt bleibt. So vermeidest du die Rundungsfehler, die bei Gleitkommazahlen oft unvermeidlich sind.
Rationale Zahlen sind ein recht einfacher numerischer Typ und funktionieren weitgehend so, wie du es erwartest. Da sie in Julia seit den frühen Versionen ein Standardtyp sind, akzeptieren die meisten Funktionen sie als Eingabewert, genauso wie Ganzzahlen und Gleitkommazahlen.
Das Erstellen ist so einfach wie die Verwendung von // zwischen zwei Ganzzahlen.
julia> 3//4
3//4
julia> a = 3; b = 4;
julia> a//b
3//4
Gemeinsame Faktoren werden automatisch entfernt, wodurch der Bruch auf seine „gekürzte Form" reduziert wird: die kleinsten Ganzzahlen, die den Bruch genau darstellen, und mit einem nicht-negativen Nenner.
julia> 5//15
1//3
julia> 5//-15
-1//3
Die üblichen arithmetic operators + - * / ^ % funktionieren mit rationalen Zahlen, im Wesentlichen genauso wie mit anderen numerischen Typen.
Ganzzahlen und andere Rationals kannst du einbeziehen, und du erhältst ein Rational-Ergebnis.
Beziehst du einen float in den Ausdruck ein, ist die Ausgabe ein float, was einen (möglichen) Verlust an Genauigkeit zur Folge hat.
Wenn du einen float möchtest, verwende einfach die Funktion float(), um eine rationale Zahl umzuwandeln.
Es ist ganz normal, rationale Zahlen zu verwenden, um die Genauigkeit über eine lange Berechnung hinweg zu bewahren, und am Ende in eine Gleitkommazahl umzuwandeln.
julia> 3//4 + 1//3 # addition
13//12
julia> 3//4 * 1//3 # multiplication
1//4
julia> 3//4 / 1//3 # division
9//4
julia> 3//4 ^ 2 # exponentiation
3//16
julia> 3//4 + 5 # rational and int => rational
23//4
julia> 3//4 + 5.3 # rational and float => float
6.05
julia> float(3//4) # casting
0.75
In Julia sind rationale Zahlen einfach Zahlen. Der Compiler wandelt Typen in der Regel nach Bedarf um.
Sei jedoch vorsichtig: Vergleiche funktionieren für Brüche mit einer endlichen Dezimaldarstellung:
julia> 3//4 == 0.75
true
julia> 3//4 < 0.74
false
Andernfalls sollte ein Rational für Vergleiche in einen Float umgewandelt werden:
julia> 1//3 == 1/3
false
julia> float(1//3) == 1/3
true
Mathematische Funktionen nehmen rationale Zahlen als Eingabewert, liefern aber möglicherweise ein Gleitkommaergebnis:
julia> sqrt(9//16)
0.75
Eine Forschungseinrichtung hat bemerkt, dass einige ihrer jungen Forschenden bei ihren Analysen mit wenig optimalen Methoden gearbeitet haben. Eine dieser Methoden besteht darin, diskrete Wahrscheinlichkeiten sofort in Gleitkommazahlen (also reelle Zahlen) umzuwandeln, bevor weitere Berechnungen durchgeführt werden.
Die erfahrenen Forschenden ziehen es vor, mit rationalen Zahlen zu rechnen, weil das eine höhere Genauigkeit liefern kann. Sie möchten wissen, ob die schlechten Praktiken der jungen Forschenden die Ergebnisse der Studien beeinflusst haben.
Es wurden zwei Arten von Studien durchgeführt:
Die erfahrenen Forschenden bitten dich, Funktionen zu schreiben, mit denen sie feststellen können, ob die Verwendung von Gleitkommazahlen zu Rundungsfehlern in den Analysen geführt hat. Außerdem sollst du für das Ergebnis eine genaue rationale Zahl angeben, wenn es Fehler gibt.
Die Funktion rationalize(successes, trials) nimmt zwei Arrays, successes und trials.
Für einen Index i entspricht successes[i] der Anzahl der Erfolge, die bei trials[i] Versuchen aufgetreten sind.
Die Funktion gibt ein Array rationaler Zahlen zurück, nämlich die Erfolge geteilt durch die Anzahl der Versuche, in derselben Reihenfolge wie die Eingabe-Arrays.
julia> rationalize([1, 2, 3], [4, 5, 6])
3-element Vector{Rational{Int64}}:
1//4
2//5
1//2
Ebenso nimmt die Funktion probabilities(successes, trials) zwei Arrays, successes und trials.
Sie gibt ein Array von Gleitkommazahlen zurück, nämlich die Erfolge geteilt durch die Anzahl der Versuche, in derselben Reihenfolge wie die Eingabe-Arrays.
julia> probabilities([1, 2, 3], [4, 5, 6])
3-element Vector{Float64}:
0.25
0.4
0.5
Die Funktion checkmean(successes, trials) nimmt die beiden Arrays successes und trials.
Sie vergleicht den Mittelwert der reellen Wahrscheinlichkeiten mit dem Mittelwert der rationalen Wahrscheinlichkeiten.
checkmean true zurück.checkmean die rationale Wahrscheinlichkeit zurück.julia> successes, trials = [9, 4, 7, 8, 6], [22, 22, 11, 17, 12];
julia> checkmean(successes, trials)
true
julia> successes, trials = [6, 5, 9, 8, 9], [21, 19, 13, 25, 22];
julia> checkmean(successes, trials)
1873629//4754750
Die Funktion checkprob(successes, trials) nimmt die beiden Arrays successes und trials.
Sie vergleicht die Gesamtwahrscheinlichkeit aus den Gleitkommawahrscheinlichkeiten mit der Gesamtwahrscheinlichkeit aus den rationalen Wahrscheinlichkeiten.
checkprob true zurück.checkprob die rationale Wahrscheinlichkeit zurück.julia> successes, trials = [2, 9, 4, 4, 5], [15, 11, 17, 19, 15];
julia> checkprob(successes, trials)
true
julia> successes, trials = [9, 8, 5, 4, 3], [22, 14, 19, 25, 18];
julia> checkprob(sucesses, trials)
12//7315
Melde dich bei Exercism an, um Julia mit 35 Konzepte128 Übungen und echtem menschlichen Mentoring zu lernen und zu meistern, alles kostenlos.