Tracks
/
WebAssembly
WebAssembly
/
Übungen
/
Rationale Zahlen
Rationale Zahlen

Rationale Zahlen

Mittel

Anleitung

Eine rationale Zahl ist als der Quotient zweier Ganzzahlen a und b definiert, die man Zähler bzw. Nenner nennt, wobei b != 0 gilt.

Note

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:

  • Addition, Subtraktion, Multiplikation und Division zweier rationaler Zahlen,
  • Betrag, Potenzieren einer gegebenen rationalen Zahl mit einer ganzzahligen Potenz, Potenzieren einer gegebenen rationalen Zahl mit einer reellen (Gleitkomma-)Potenz, Potenzieren einer reellen Zahl mit einer rationalen Zahl.

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.

Die Potenzierung rationaler Zahlen mit einer reellen Zahl erfordert die Berechnung einer Zahl hoch einem nicht ganzzahligen Exponenten, eine Funktionalität, die in WebAssembly nicht nativ verfügbar ist.

Man kann x ^ y aber auch als x ^ y = exp(y * ln(x)) ausdrücken.

Und zum Glück kann man verschiedene Reihen verwenden, um die Exponentialfunktion und den natürlichen Logarithmus zu berechnen.

Exponentialfunktion

Die beste Lösung für die Exponentialfunktion ist eine Taylor-Reihe:

exp(x) ≃ 1 + x + x ^ 2 / 2! + x ^ 3 / 3! + x ^ 4 / 4! + ... + x ^ n / n!

Logarithmusfunktion (für positives x)

Es gibt mehrere Möglichkeiten, einen natürlichen Logarithmus effizient zu berechnen. Eine davon ist eine Reihe, die auf einem inversen hyperbolischen Tangens basiert:

ln(x) / 2 ≃ y + y ^ 3 / 3 + y ^ 5 / 5 + ... + y ^ n / n where y = (x - 1) / (x + 1)

Es gibt auch noch eine weitere Taylor-Reihe, um den natürlichen Logarithmus zu berechnen:

ln(x) = (x - 1) - (x - 1) ^ 2 / 2 + (x  - 1) ^ 3 / 3 - (x - 1) ^ 4 / 4 ... + (x - 1) ^ n / n

Sie ist nur für x zwischen 0 und 2 genau. Allerdings können wir auch ln(x) = - ln(1 / x) verwenden.

Ganzzahlige Potenzierung

Für die ganzzahlige Potenzierung solltest du besser die Multiplikation und entweder eine Schleife oder eine Rekursion verwenden, und zwar sowohl aus Performance- als auch aus Präzisionsgründen. Für noch mehr Performance kann man die Methode von Horner verwenden, um die Anzahl der Multiplikationen zu reduzieren.


Quelle

WikipediaDer Link öffnet sich in einem neuen Fenster oder Tab
Über GitHub bearbeiten Der Link öffnet sich in einem neuen Fenster oder Tab
WebAssembly Exercism

Bereit, mit Rationale Zahlen zu starten?

Melde dich bei Exercism an, um WebAssembly mit 87 Übungen und echtem menschlichen Mentoring zu lernen und zu meistern, alles kostenlos.