A racionális szám két egész szám, a és b hányadosaként definiálható; a a számláló, b pedig a nevező, és b != 0.
Vedd figyelembe, hogy matematikailag a nevező nem lehet nulla. A racionális számok számos implementációjában azonban azt tapasztalhatod, hogy a nevező lehet nulla, viselkedése pedig hasonló a lebegőpontos számok pozitív vagy negatív végtelenéhez. Ezekben az esetekben a nevező és a számláló általában továbbra sem lehet egyszerre nulla.
Az r = a/b racionális szám abszolútértéke, |r|, egyenlő |a|/|b|-vel.
Két racionális szám, r₁ = a₁/b₁ és r₂ = a₂/b₂ összege r₁ + r₂ = a₁/b₁ + a₂/b₂ = (a₁ * b₂ + a₂ * b₁) / (b₁ * b₂).
Két racionális szám, r₁ = a₁/b₁ és r₂ = a₂/b₂ különbsége r₁ - r₂ = a₁/b₁ - a₂/b₂ = (a₁ * b₂ - a₂ * b₁) / (b₁ * b₂).
Két racionális szám, r₁ = a₁/b₁ és r₂ = a₂/b₂ szorzata r₁ * r₂ = (a₁ * a₂) / (b₁ * b₂).
Az r₁ = a₁/b₁ racionális számot egy másik r₂ = a₂/b₂ racionális számmal elosztva r₁ / r₂ = (a₁ * b₂) / (a₂ * b₁) adódik, ha a₂ nem nulla.
Egy r = a/b racionális számot nemnegatív egész n kitevőre hatványozva r^n = (a^n)/(b^n) adódik.
Egy r = a/b racionális számot negatív egész n kitevőre hatványozva r^n = (b^m)/(a^m) adódik, ahol m = |n|.
Egy r = a/b racionális számot egy valós (lebegőpontos) x számra hatványozva a (a^x)/(b^x) hányadost kapjuk, ami valós szám.
Egy valós x számot egy r = a/b racionális számra hatványozva x^(a/b) = root(x^a, b) adódik, ahol root(p, q) a p q-adik gyöke.
Valósítsd meg a következő műveleteket:
A racionális számok implementációjában a számokat mindig a lehető legegyszerűbb alakra kell egyszerűsíteni.
Például a 4/4 1/1-re, a 30/60 1/2-re, a 12/8 3/2-re egyszerűsödik, stb.
Egy r = a/b racionális szám egyszerűsítéséhez oszd el a-t és b-t a és b legnagyobb közös osztójával (gcd).
Tehát például gcd(12, 8) = 4, így az r = 12/8 egyszerűsíthető (12/4)/(8/4) = 3/2-re.
A racionális szám egyszerűsített alakjának „standard alakban” kell lennie (a nevezőnek mindig pozitív egész számnak kell lennie).
Ha a nevező negatív egész számot tartalmaz, szorozd meg a számlálót és a nevezőt is -1-gyel, hogy elérd a standard alakot.
Például a 3/-4 -3/4-re egyszerűsödik.
Feltételezzük, hogy a programozási nyelv, amit használsz, nem tartalmaz racionális számokra vonatkozó implementációt.
A racionális számok valós kitevőre emelése egy szám nem egész kitevőjű hatványának kiszámítását igényli, ami a WebAssemblyben natívan nem elérhető.
A x ^ y kifejezést azonban felírhatod x ^ y = exp(y * ln(x)) alakban is.
Szerencsére az exponenciális függvény és a természetes logaritmus kiszámítására különböző sorokat használhatunk.
Az exponenciális függvényre a legjobb megoldás egy Taylor-sor:
exp(x) ≃ 1 + x + x ^ 2 / 2! + x ^ 3 / 3! + x ^ 4 / 4! + ... + x ^ n / n!
Többféleképpen is hatékonyan kiszámítható a természetes logaritmus. Az egyik egy inverz hiperbolikus tangensen alapuló sor:
ln(x) / 2 ≃ y + y ^ 3 / 3 + y ^ 5 / 5 + ... + y ^ n / n where y = (x - 1) / (x + 1)
A természetes logaritmus kiszámítására egy másik Taylor-sor is használható:
ln(x) = (x - 1) - (x - 1) ^ 2 / 2 + (x - 1) ^ 3 / 3 - (x - 1) ^ 4 / 4 ... + (x - 1) ^ n / n
Ez csak akkor pontos, ha x 0 és 2 között van. Viszont használhatjuk a ln(x) = - ln(1 / x) összefüggést is.
Egész kitevőjű hatványozásnál jobb, ha szorzást, valamint ciklust vagy rekurziót használsz, teljesítménybeli és pontossági okokból egyaránt. A további teljesítménynövelés érdekében használhatod a Horner-módszert, hogy csökkentsd a szorzások számát.
Iratkozz fel az Exercism-re, hogy megtanuld és elsajátítsd a(z) WebAssembly nyelvet 87 feladat segítségével, valódi emberi mentorálással, mindez ingyen.