A Rational numbers olyan törtek, amelyeknek a számlálója és a nevezője is egész szám.
Például a 2//3-at eltárolhatjuk pontos törtként a hozzávetőleges Float64 érték helyett, ami 0.6666...
Ennek az az előnye, hogy (kivéve az egész szám túlcsordulás szélsőséges esetét) a racionális szám pontos marad, elkerülve azokat a kerekítési hibákat, amelyek a lebegőpontos számoknál gyakran elkerülhetetlenek.
A racionális számok meglehetősen egyszerű numerikus típust alkotnak, és pontosan úgy viselkednek, ahogy várnád. Mivel a Julia korai verziói óta szabványos típusnak számítanak, a legtöbb függvény ugyanúgy elfogadja őket bemenetként, mint az egész számokat és a lebegőpontos számokat.
A létrehozás nem bonyolultabb annál, mint hogy //-t írunk két egész szám közé.
julia> 3//4
3//4
julia> a = 3; b = 4;
julia> a//b
3//4
A közös tényezőket automatikusan eltávolítja, így a tört a „legegyszerűbb alakjára” redukálódik: a legkisebb egész számokra, amelyek pontosan reprezentálják a törtet, nem negatív nevezővel.
julia> 5//15
1//3
julia> 5//-15
-1//3
A szokásos arithmetic operators, a + - * / ^ % ugyanúgy működik a racionális számokkal, lényegében mint a többi numerikus típussal.
Az egész számok és más Rational-ok is szerepelhetnek benne, és Rational eredményt adnak.
Ha float kerül a kifejezésbe, az eredmény is float lesz, ami a pontosság esetleges elvesztésével járhat.
Ha float-ra van szükséged, egyszerűen a float() függvénnyel alakítsd át a racionális számot.
Teljesen megszokott, hogy egy hosszú számítás során racionális számokkal őrizzük meg a pontosságot, majd a végén lebegőpontos számmá alakítjuk az eredményt.
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
A Juliában a racionális számok egyszerűen csak számok. A fordító általában szükség szerint átalakítja a típusokat.
Vigyázat azonban: az összehasonlítás csak véges tizedestört alakkal rendelkező törteknél működik:
julia> 3//4 == 0.75
true
julia> 3//4 < 0.74
false
Minden más esetben viszont az összehasonlításhoz a Rational-t Float-tá kell alakítani:
julia> 1//3 == 1/3
false
julia> float(1//3) == 1/3
true
A matematikai függvények elfogadnak racionális számokat bemenetként, de lebegőpontos eredményt adhatnak:
julia> sqrt(9//16)
0.75
Egy kutatószervezet észrevette, hogy néhány fiatal kutatója kevésbé optimális módszerekkel dolgozott az elemzései során. Az egyik ilyen módszer, hogy a diszkrét valószínűségeket még a további számítások előtt azonnal tizedes törtekké (vagyis valós számokká) alakítják.
A tapasztalt kutatók inkább racionális számokkal szeretnének számolni, mert azok nagyobb pontosságot nyújthatnak, és szeretnék megtudni, hogy a fiatal kutatók rossz gyakorlata hatással volt-e a vizsgálatok eredményeire.
Kétféle vizsgálatot végeztek:
A tapasztalt kutatók arra kérnek, hogy írj függvényeket, amelyek segítenek megállapítani, hogy a tizedes törtekkel végzett számítások miatt vannak-e kerekítési hibák az elemzésekben, és ha vannak, adj meg egy pontos racionális számot az eredményre.
A rationalize(successes, trials) függvény két tömböt kap: a successes-t és a trials-t.
Egy i index esetén a successes[i] a trials[i] számú kísérlet során elért sikerek számát adja meg.
A függvény a sikereknek a kísérletek számához viszonyított arányát adja vissza racionális számok tömbjeként, ugyanabban a sorrendben, mint a bemeneti tömbök.
julia> rationalize([1, 2, 3], [4, 5, 6])
3-element Vector{Rational{Int64}}:
1//4
2//5
1//2
Hasonlóképpen a probabilities(successes, trials) függvény is két tömböt kap: a successes-t és a trials-t.
A sikereknek a kísérletek számához viszonyított arányát adja vissza tizedes törtek tömbjeként, ugyanabban a sorrendben, mint a bemeneti tömbök.
julia> probabilities([1, 2, 3], [4, 5, 6])
3-element Vector{Float64}:
0.25
0.4
0.5
A checkmean(successes, trials) a két tömböt, a successes-t és a trials-t kapja.
A valós valószínűségek átlagát hasonlítja össze a racionális valószínűségek átlagával.
checkmean a true értéket adja vissza.checkmean a racionális valószínűséget adja vissza.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
A checkprob(successes, trials) a két tömböt, a successes-t és a trials-t kapja.
A tizedes tört valószínűségek együttes valószínűségét hasonlítja össze a racionális valószínűségek együttes valószínűségével.
checkprob a true értéket adja vissza.checkprob a racionális valószínűséget adja vissza.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
Iratkozz fel az Exercism-re, hogy megtanuld és elsajátítsd a(z) Julia nyelvet 35 fogalom128 feladat segítségével, valódi emberi mentorálással, mindez ingyen.