Rational numbers کسرهایی هستند که صورت آنها یک عدد صحیح و مخرجشان یک عدد صحیح است.
برای مثال، میتوانیم 2//3 را بهصورت یک کسر دقیق ذخیره کنیم، بهجای مقدار تقریبی Float64 که 0.6666... است.
مزیت این کار آن است که (جز در حالت حاد سرریز عدد صحیح) یک عدد گویا دقیق باقی میماند و از خطاهای گردکردنی که در اعداد ممیز شناور اغلب گریزناپذیرند جلوگیری میکند.
اعداد گویا نوع عددی نسبتاً سادهای هستند و قرار است تقریباً همانطور که انتظار دارید عمل کنند. چون از نخستین نسخهها یک نوع استاندارد در Julia بودهاند، بیشتر توابع آنها را همانند اعداد صحیح و ممیز شناور بهعنوان ورودی میپذیرند.
ساختن آنها به همین سادگی است که // را بین دو عدد صحیح قرار دهید.
julia> 3//4
3//4
julia> a = 3; b = 4;
julia> a//b
3//4
عاملهای مشترک بهطور خودکار حذف میشوند و کسر به «سادهترین شکل» خود تبدیل میشود: کوچکترین اعداد صحیحی که کسر را بهدرستی نمایش میدهند و مخرجی نامنفی دارند.
julia> 5//15
1//3
julia> 5//-15
-1//3
arithmetic operators معمول، یعنی + - * / ^ %، با اعداد گویا کار میکنند، تقریباً همانطور که با دیگر انواع عددی کار میکنند.
اعداد صحیح و دیگر Rationalها را میتوان در عبارت گنجاند و نتیجه یک Rational به دست میآید.
گنجاندن یک float در عبارت، خروجی float میدهد و در پی آن (احتمالاً) دقت از دست میرود.
اگر float میخواهید، کافی است از تابع float() برای تبدیل یک عدد گویا استفاده کنید.
کاملاً معمول است که از اعداد گویا برای حفظ دقت در یک محاسبهی طولانی استفاده کنید و در پایان، نتیجه را به float تبدیل کنید.
julia> 3//4 + 1//3 # addition
13//12
julia> 3//4 * 1//3 # multiplication
1//4
julia> 3//4 / 1//3 # division
9//4
julia> 3//4 ^ 2 # exponentiation
3//16
julia> 3//4 + 5 # rational and int => rational
23//4
julia> 3//4 + 5.3 # rational and float => float
6.05
julia> float(3//4) # casting
0.75
در Julia، اعداد گویا فقط عدد هستند. کامپایلر معمولاً در صورت نیاز نوعها را تبدیل میکند.
با این حال، حواستان باشد که مقایسهها برای کسرهایی کار میکنند که نمایش اعشاری متناهی دارند:
julia> 3//4 == 0.75
true
julia> 3//4 < 0.74
false
اما در غیر این صورت، برای مقایسهها باید یک Rational را به Float تبدیل کرد:
julia> 1//3 == 1/3
false
julia> float(1//3) == 1/3
true
توابع ریاضی اعداد گویا را بهعنوان ورودی میپذیرند، اما ممکن است نتیجهای ممیز شناور بدهند:
julia> sqrt(9//16)
0.75
یک سازمان پژوهشی متوجه شده است که برخی از پژوهشگران تازهکارش در تحلیلهای خود از روشهای چندان بهینهای استفاده میکنند. یکی از این روشها، تبدیل بیدرنگ احتمالهای گسسته به اعداد اعشاری (یعنی اعداد حقیقی) پیش از انجام محاسبات بیشتر است.
پژوهشگران ارشد ترجیح میدهند در محاسبات از اعداد گویا استفاده کنند، چون ممکن است دقت بالاتری به دست دهد، و میخواهند بدانند آیا روشهای ضعیف پژوهشگران تازهکار روی نتایج مطالعات تأثیر گذاشته است یا نه.
دو نوع مطالعه انجام شده بود:
پژوهشگران ارشد از شما میخواهند توابعی بنویسید که به آنها کمک کند تعیین کنند آیا در تحلیلهایی که با اعداد اعشاری انجام شده خطای گرد کردن وجود دارد یا نه، و اگر چنین خطاهایی هست، یک عدد گویای دقیق برای نتیجه در اختیارشان بگذارید.
تابع rationalize(successes, trials) دو آرایهی successes و trials را میگیرد.
برای اندیس i، مقدار successes[i] به تعداد موفقیتهایی اشاره دارد که در trials[i] آزمون رخ داده است.
این تابع آرایهای از اعداد گویا برمیگرداند که نسبت موفقیتها به تعداد آزمونها را نشان میدهد، با همان ترتیبی که در آرایههای ورودی آمده است.
julia> rationalize([1, 2, 3], [4, 5, 6])
3-element Vector{Rational{Int64}}:
1//4
2//5
1//2
به همین ترتیب، تابع probabilities(successes, trials) دو آرایهی successes و trials را میگیرد.
این تابع آرایهای از اعداد اعشاری برمیگرداند که نسبت موفقیتها به تعداد آزمونها را نشان میدهد، با همان ترتیبی که در آرایههای ورودی آمده است.
julia> probabilities([1, 2, 3], [4, 5, 6])
3-element Vector{Float64}:
0.25
0.4
0.5
تابع checkmean(successes, trials) دو آرایهی successes و trials را میگیرد.
این تابع میانگین احتمالهای حقیقی را با میانگین احتمالهای گویا مقایسه میکند.
checkmean مقدار true را برمیگرداند.checkmean احتمال گویا را برمیگرداند.julia> successes, trials = [9, 4, 7, 8, 6], [22, 22, 11, 17, 12];
julia> checkmean(successes, trials)
true
julia> successes, trials = [6, 5, 9, 8, 9], [21, 19, 13, 25, 22];
julia> checkmean(successes, trials)
1873629//4754750
تابع checkprob(successes, trials) دو آرایهی successes و trials را میگیرد.
این تابع احتمال کل حاصل از احتمالهای اعشاری را با احتمال کل حاصل از احتمالهای گویا مقایسه میکند.
checkprob مقدار true را برمیگرداند.checkprob احتمال گویا را برمیگرداند.julia> successes, trials = [2, 9, 4, 4, 5], [15, 11, 17, 19, 15];
julia> checkprob(successes, trials)
true
julia> successes, trials = [9, 8, 5, 4, 3], [22, 14, 19, 25, 18];
julia> checkprob(sucesses, trials)
12//7315