Rational numbers sono frazioni con un numeratore intero diviso per un denominatore intero.
Ad esempio, possiamo memorizzare 2//3 come frazione esatta invece del valore approssimato Float64 0.6666...
Il vantaggio è che (tranne nel caso estremo di overflow di interi) un numero razionale rimane esatto, evitando gli errori di arrotondamento spesso inevitabili con i numeri in virgola mobile.
I numeri razionali sono un tipo numerico piuttosto semplice e sono pensati per funzionare proprio come ti aspetteresti. Poiché sono un tipo standard in Julia fin dalle prime versioni, la maggior parte delle funzioni li accetta come input allo stesso modo degli interi e dei numeri in virgola mobile.
La creazione è semplice come usare // tra due interi.
julia> 3//4
3//4
julia> a = 3; b = 4;
julia> a//b
3//4
I fattori comuni vengono rimossi automaticamente, convertendo la frazione ai suoi «minimi termini»: i più piccoli interi che rappresentano accuratamente la frazione, con denominatore non negativo.
julia> 5//15
1//3
julia> 5//-15
-1//3
I soliti arithmetic operators + - * / ^ % funzionano con i razionali, essenzialmente come con gli altri tipi numerici.
Gli interi e altri Rational possono essere inclusi e danno come risultato un Rational.
Includere un float nell'espressione produce un output float, con una conseguente (possibile) perdita di precisione.
Se desideri un float, usa semplicemente la funzione float() per convertire un razionale.
È del tutto normale usare numeri razionali per preservare la precisione durante un calcolo lungo, per poi convertire in un numero in virgola mobile alla fine.
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
In Julia, i numeri razionali sono semplicemente numeri. Di solito il compilatore converte i tipi secondo necessità.
Tuttavia, fai attenzione: i confronti funzionano per frazioni con una rappresentazione decimale finita:
julia> 3//4 == 0.75
true
julia> 3//4 < 0.74
false
Negli altri casi, però, un Rational va convertito in un Float per i confronti:
julia> 1//3 == 1/3
false
julia> float(1//3) == 1/3
true
Le funzioni matematiche accettano numeri razionali come input, ma possono restituire un risultato in virgola mobile:
julia> sqrt(9//16)
0.75
Un'organizzazione di ricerca ha notato che alcuni dei suoi ricercatori junior hanno usato metodi poco ottimali nelle loro analisi. Uno di questi metodi consiste nel convertire immediatamente le probabilità discrete in numeri in virgola mobile (cioè numeri reali) prima di eseguire ulteriori calcoli.
I ricercatori senior preferiscono usare numeri razionali nei calcoli, che possono garantire una precisione maggiore, e vorrebbero sapere se le pratiche scadenti dei ricercatori junior hanno influenzato gli esiti degli studi.
Sono stati condotti due tipi di studi:
I ricercatori senior ti chiedono di scrivere funzioni che li aiutino a determinare se ci sono errori di arrotondamento nelle analisi dovuti all'uso dei numeri in virgola mobile, e di fornire un numero razionale preciso per il risultato qualora ci siano errori.
La funzione rationalize(successes, trials) prende due array, successes e trials.
Per un indice i, successes[i] corrisponde al numero di successi che si sono verificati in trials[i] prove.
La funzione restituisce un array di numeri razionali dei successi sul numero di prove, nello stesso ordine degli array di input.
julia> rationalize([1, 2, 3], [4, 5, 6])
3-element Vector{Rational{Int64}}:
1//4
2//5
1//2
Allo stesso modo, la funzione probabilities(successes, trials) prende due array, successes e trials.
Restituisce un array di numeri in virgola mobile dei successi sul numero di prove, nello stesso ordine degli array di input.
julia> probabilities([1, 2, 3], [4, 5, 6])
3-element Vector{Float64}:
0.25
0.4
0.5
La funzione checkmean(successes, trials) prende i due array, successes e trials.
Confronta la media delle probabilità reali con la media delle probabilità razionali.
checkmean restituisce true
checkmean restituisce la probabilità razionale.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
La funzione checkprob(successes, trials) prende i due array, successes e trials.
Confronta la probabilità totale calcolata con i numeri in virgola mobile con quella calcolata con i numeri razionali.
checkprob restituisce true
checkprob restituisce la probabilità razionale.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
Iscriviti a Exercism per imparare e padroneggiare Julia con 35 concetti128 esercizi e il mentoring di persone reali, tutto gratis.