Ένας ρητός αριθμός ορίζεται ως το πηλίκο δύο ακεραίων a και b, που ονομάζονται αριθμητής και παρονομαστής αντίστοιχα, όπου b != 0.
Σημείωσε ότι μαθηματικά, ο παρονομαστής δε μπορεί να είναι μηδέν. Ωστόσο, σε πολλές υλοποιήσεις ρητών αριθμών, θα διαπιστώσεις ότι ο παρονομαστής επιτρέπεται να είναι μηδέν, με συμπεριφορά παρόμοια με το θετικό ή αρνητικό άπειρο στους αριθμούς κινητής υποδιαστολής. Σε αυτές τις περιπτώσεις, ο παρονομαστής και ο αριθμητής γενικά και πάλι δε μπορούν να είναι ταυτόχρονα μηδέν.
Η απόλυτη τιμή |r| του ρητού αριθμού r = a/b είναι ίση με |a|/|b|.
Το άθροισμα δύο ρητών αριθμών r₁ = a₁/b₁ και r₂ = a₂/b₂ είναι r₁ + r₂ = a₁/b₁ + a₂/b₂ = (a₁ * b₂ + a₂ * b₁) / (b₁ * b₂).
Η διαφορά δύο ρητών αριθμών r₁ = a₁/b₁ και r₂ = a₂/b₂ είναι r₁ - r₂ = a₁/b₁ - a₂/b₂ = (a₁ * b₂ - a₂ * b₁) / (b₁ * b₂).
Το γινόμενο (ο πολλαπλασιασμός) δύο ρητών αριθμών r₁ = a₁/b₁ και r₂ = a₂/b₂ είναι r₁ * r₂ = (a₁ * a₂) / (b₁ * b₂).
Η διαίρεση ενός ρητού αριθμού r₁ = a₁/b₁ με έναν άλλον r₂ = a₂/b₂ είναι r₁ / r₂ = (a₁ * b₂) / (a₂ * b₁) αν το a₂ δεν είναι μηδέν.
Η ύψωση ενός ρητού αριθμού r = a/b σε μη αρνητική ακέραια δύναμη n είναι r^n = (a^n)/(b^n).
Η ύψωση ενός ρητού αριθμού r = a/b σε αρνητική ακέραια δύναμη n είναι r^n = (b^m)/(a^m), όπου m = |n|.
Η ύψωση ενός ρητού αριθμού r = a/b σε πραγματικό (κινητής υποδιαστολής) αριθμό x είναι το πηλίκο (a^x)/(b^x), που είναι ένας πραγματικός αριθμός.
Η ύψωση ενός πραγματικού αριθμού x σε ρητό αριθμό r = a/b είναι x^(a/b) = root(x^a, b), όπου root(p, q) είναι η q-οστή ρίζα του p.
Υλοποίησε τις παρακάτω πράξεις:
Η υλοποίησή σου των ρητών αριθμών θα πρέπει πάντα να είναι ανηγμένη στους ελάχιστους όρους.
Για παράδειγμα, το 4/4 θα πρέπει να ανάγεται σε 1/1, το 30/60 θα πρέπει να ανάγεται σε 1/2, το 12/8 θα πρέπει να ανάγεται σε 3/2, κ.λπ.
Για να ανάγεις έναν ρητό αριθμό r = a/b, διαίρεσε το a και το b με τον μέγιστο κοινό διαιρέτη (ΜΚΔ) των a και b.
Έτσι, για παράδειγμα, gcd(12, 8) = 4, άρα το r = 12/8 μπορεί να αναχθεί σε (12/4)/(8/4) = 3/2.
Η ανηγμένη μορφή ενός ρητού αριθμού θα πρέπει να είναι σε "τυπική μορφή" (ο παρονομαστής θα πρέπει πάντα να είναι ένας θετικός ακέραιος).
Αν υπάρχει παρονομαστής με αρνητικό ακέραιο, πολλαπλασίασε και τον αριθμητή και τον παρονομαστή με -1 για να διασφαλίσεις ότι επιτυγχάνεται η τυπική μορφή.
Για παράδειγμα, το 3/-4 θα πρέπει να ανάγεται σε -3/4
Θεώρησε ότι η γλώσσα προγραμματισμού που χρησιμοποιείς δε έχει κάποια υλοποίηση ρητών αριθμών.
Η ύψωση ρητών αριθμών σε πραγματικό αριθμό απαιτεί τον υπολογισμό ενός αριθμού σε δύναμη με μη ακέραιο εκθέτη, μια λειτουργικότητα που δεν είναι εγγενώς διαθέσιμη στη WebAssembly.
Ωστόσο, μπορείς επίσης να εκφράσεις το x ^ y ως x ^ y = exp(y * ln(x)).
Και ευτυχώς, μπορείς να χρησιμοποιήσεις διαφορετικές σειρές για να υπολογίσεις την εκθετική συνάρτηση και τον φυσικό λογάριθμο.
Η καλύτερη λύση για την εκθετική είναι μια σειρά Taylor:
exp(x) ≃ 1 + x + x ^ 2 / 2! + x ^ 3 / 3! + x ^ 4 / 4! + ... + x ^ n / n!
Υπάρχουν πολλοί τρόποι για να υπολογίσεις αποδοτικά έναν φυσικό λογάριθμο. Ένας από αυτούς είναι μια σειρά που βασίζεται σε μια αντίστροφη υπερβολική εφαπτομένη:
ln(x) / 2 ≃ y + y ^ 3 / 3 + y ^ 5 / 5 + ... + y ^ n / n where y = (x - 1) / (x + 1)
Υπάρχει επίσης άλλη μια σειρά Taylor για τον υπολογισμό του φυσικού λογαρίθμου:
ln(x) = (x - 1) - (x - 1) ^ 2 / 2 + (x - 1) ^ 3 / 3 - (x - 1) ^ 4 / 4 ... + (x - 1) ^ n / n
Είναι ακριβής μόνο για x μεταξύ 0 και 2. Ωστόσο, μπορούμε επίσης να χρησιμοποιήσουμε το ln(x) = - ln(1 / x)
Για την ύψωση σε ακέραιο εκθέτη, καλύτερα να χρησιμοποιήσεις πολλαπλασιασμό και είτε έναν βρόχο είτε αναδρομή, τόσο για λόγους απόδοσης όσο και για λόγους ακρίβειας. Για επιπλέον απόδοση, μπορείς να χρησιμοποιήσεις τη μέθοδο Horner για να μειώσεις τον αριθμό των πολλαπλασιασμών.
Γράψου στο Exercism για να μάθεις και να κατακτήσεις WebAssembly με 87 ασκήσεις και πραγματική καθοδήγηση από ανθρώπους, όλα δωρεάν.