有理數定義為兩個整數a和b的商,分別稱為分子與分母,其中b != 0。
請注意,在數學上,分母不能為零。 不過在許多有理數的實作中,你會發現分母可以為零,其行為類似於浮點數中的正無限大或負無限大。 在這些情況下,分子與分母通常仍然不能同時為零。
有理數r = a/b的絕對值|r|等於|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₂,在a₂不為零時,結果是r₁ / r₂ = (a₁ * b₂) / (a₂ * b₁)。
有理數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)是p的q次方根。
實作以下運算:
你的有理數實作應該一律約分成最簡形式。
例如,4/4應該約分成1/1,30/60應該約分成1/2,12/8應該約分成3/2,依此類推。
要約分有理數r = a/b,就將a和b同除以a和b的最大公因數(gcd)。
因此,舉例來說,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)。
整數次方的話,最好改用乘法,再搭配迴圈或遞迴,這麼做同時考量到效能和精確度。如果想進一步提升效能,可以使用霍納法來減少乘法的次數。