یک عدد گویا بهعنوان خارجقسمت دو عدد صحیح 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 را بر بزرگترین مقسومعلیه مشترک (gcd) 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!
x مثبت)روشهای متعددی برای محاسبهی کارآمد لگاریتم طبیعی وجود دارد. یکی از آنها سریای است بر پایهی تانژانت هذلولوی معکوس:
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 بین ۰ و ۲ دقیق است. اما میتوان از ln(x) = - ln(1 / x) هم استفاده کرد.
برای توانرسانی عدد صحیح، بهتر است از ضرب و یکی از دو روش «حلقه» یا بازگشت استفاده کنید، هم به دلایل کارایی و هم دقت. برای کارایی بیشتر، میتوان از روش هورنر برای کاهش تعداد ضربها استفاده کرد.
در Exercism ثبتنام کنید تا WebAssembly را همراه با 87 تمرین و مربیگری انسانی واقعی یاد بگیرید و در آن استاد شوید، همهی اینها رایگان.