Раціональне число визначається як частка двох цілих чисел 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)).
І, на щастя, для обчислення експоненти й натурального логарифма можна скористатися різними рядами.
Найкращий спосіб обчислити експоненту - ряд Тейлора:
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)
Є й інший ряд Тейлора для обчислення натурального логарифма:
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)
Для піднесення до цілого степеня краще використовувати множення разом із циклом або рекурсією, і заради швидкодії, і заради точності. А щоб досягти ще кращої швидкодії, можна скористатися методом Горнера, який зменшує кількість множень.
Зареєструйтеся на Exercism, щоб вивчати й опановувати WebAssembly, а також 87 вправ та справжнє наставництво від людей, і все це безкоштовно.