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(), яка перетворює раціональне число.
Цілком нормально використовувати раціональні числа, щоб зберегти точність протягом довгих обчислень, а в кінці перетворити результат на число з плаваючою комою.
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
Зареєструйтеся на Exercism, щоб вивчати й опановувати Julia, а також 35 концепцій128 вправ та справжнє наставництво від людей, і все це безкоштовно.