Eine rationale Zahl ist als der Quotient zweier Ganzzahlen a und b definiert, die man Zähler bzw. Nenner nennt, wobei b != 0 gilt.
Beachte, dass der Nenner mathematisch nicht null sein kann. In vielen Implementierungen rationaler Zahlen ist der Nenner jedoch null erlaubt, mit einem Verhalten ähnlich wie positiv oder negativ Unendlich bei Gleitkommazahlen. In diesen Fällen können Nenner und Zähler trotzdem im Allgemeinen nicht gleichzeitig null sein.
Der Betrag |r| der rationalen Zahl r = a/b ist gleich |a|/|b|.
Die Summe zweier rationaler Zahlen r₁ = a₁/b₁ und r₂ = a₂/b₂ ist r₁ + r₂ = a₁/b₁ + a₂/b₂ = (a₁ * b₂ + a₂ * b₁) / (b₁ * b₂).
Die Differenz zweier rationaler Zahlen r₁ = a₁/b₁ und r₂ = a₂/b₂ ist r₁ - r₂ = a₁/b₁ - a₂/b₂ = (a₁ * b₂ - a₂ * b₁) / (b₁ * b₂).
Das Produkt (die Multiplikation) zweier rationaler Zahlen r₁ = a₁/b₁ und r₂ = a₂/b₂ ist r₁ * r₂ = (a₁ * a₂) / (b₁ * b₂).
Die Division einer rationalen Zahl r₁ = a₁/b₁ durch eine andere r₂ = a₂/b₂ ergibt r₁ / r₂ = (a₁ * b₂) / (a₂ * b₁), wenn a₂ nicht null ist.
Das Potenzieren einer rationalen Zahl r = a/b mit einer nicht negativen ganzzahligen Potenz n ergibt r^n = (a^n)/(b^n).
Das Potenzieren einer rationalen Zahl r = a/b mit einer negativen ganzzahligen Potenz n ergibt r^n = (b^m)/(a^m), wobei m = |n| ist.
Das Potenzieren einer rationalen Zahl r = a/b mit einer reellen (Gleitkomma-)Zahl x ergibt den Quotienten (a^x)/(b^x), der eine reelle Zahl ist.
Das Potenzieren einer reellen Zahl x mit einer rationalen Zahl r = a/b ergibt x^(a/b) = root(x^a, b), wobei root(p, q) die q-te Wurzel von p ist.
Implementiere die folgenden Operationen:
Deine Implementierung rationaler Zahlen sollte immer vollständig gekürzt sein.
Zum Beispiel sollte 4/4 zu 1/1 gekürzt werden, 30/60 zu 1/2, 12/8 zu 3/2 usw.
Um eine rationale Zahl r = a/b zu kürzen, teilst du a und b durch den größten gemeinsamen Teiler (ggT) von a und b.
So ist zum Beispiel gcd(12, 8) = 4, also lässt sich r = 12/8 zu (12/4)/(8/4) = 3/2 kürzen.
Die gekürzte Form einer rationalen Zahl sollte in „Standardform“ vorliegen (der Nenner sollte immer eine positive Ganzzahl sein).
Wenn ein Nenner mit einer negativen Ganzzahl vorliegt, multipliziere sowohl den Zähler als auch den Nenner mit -1, um die Standardform zu erreichen.
Zum Beispiel sollte 3/-4 zu -3/4 gekürzt werden.
Gehe davon aus, dass die Programmiersprache, die du verwendest, keine Implementierung rationaler Zahlen hat.
Definiere ein rat-Tupel mit den Slots numerator und denominator.
<rat> sollte seine Argumente so weit wie möglich kürzen, mit dem
Vorzeichen im Zähler (der Nenner ist also immer positiv).
<rat> ( numerator denominator -- rat ) – erzeugt eine gekürzte
rationale Zahl.>rat ( pair -- rat ) – baut ein rat aus { numerator denominator }.rat>pair ( rat -- pair ) – gibt { numerator denominator } zurück.r+ ( a b -- c ), r- ( a b -- c ), r* ( a b -- c ),
r/ ( a b -- c ) – Rechenoperationen mit zwei rationalen Zahlen.r-abs ( a -- |a| ) – Absolutbetrag.r^ ( a n -- a^n ) – potenziert eine rationale Zahl mit einer ganzzahligen
Potenz (negative Exponenten sind erlaubt).real^r ( x a -- y ) – potenziert eine reelle Zahl mit einem rationalen
Exponenten und gibt eine Gleitkommazahl zurück.Die MATH:-Generics von Factor (+, -, *, /) sind nur für
die eingebaute Mathematik-Hierarchie definiert, deshalb verwendet diese
Übung eigene Word-Namen statt Methoden auf diesen Generics.
Melde dich bei Exercism an, um Factor mit 47 Konzepte163 Übungen und echtem menschlichen Mentoring zu lernen und zu meistern, alles kostenlos.