Fractions/fi: what changed
Revision 2 to 3. Removed lines have a minus sign; added lines have a plus sign.
| Old | New | Line | |
|---|---|---|---|
| 1 | - | ||
| 1 | + | ## Contents | |
| 2 | 2 | ||
| 3 | - | ||
| 4 | - | ||
| 3 | + | * 1 Mikä on Fractions unit? | |
| 4 | + | * 2 Subversion | |
| 5 | + | * 3 Ominaisuudet | |
| 6 | + | * 3.1 TFraction tyyppi | |
| 7 | + | * 3.1.1 TFraction ominaisuudet | |
| 8 | + | * 3.1.2 TFraction metodit | |
| 9 | + | * 3.2 Murtolukujen tekeminen | |
| 10 | + | * 3.3 Tuetut laskut | |
| 11 | + | * 3.3.1 Operaattorit (Overloaded operators) | |
| 12 | + | * 3.3.2 Matemaattiset funktiot | |
| 13 | + | * 3.4 Yleiskäyttöiset funktiot | |
| 14 | + | * 4 Muunnos rutiinit | |
| 15 | + | * 5 Esimerkkiohjelma | |
| 5 | 16 | ||
| 6 | - | ||
| 17 | + | ## Mikä on Fractions unit? | |
| 7 | 18 | ||
| 8 | - | ||
| 19 | + | Fractions on [[Unit/fi|käännösyksikko (unit)]] joka suorittaa laskuja murtoluvuilla. | |
| 20 | + | Käännösyksikkö syntyi keskustelun pohjalta [discussion on the Lazarus forum](<http://forum.lazarus.freepascal.org/index.php/topic,27805.0.html>). | |
| 9 | 21 | ||
| 10 | - | ||
| 22 | + | ## Subversion | |
| 11 | 23 | ||
| 12 | - | ||
| 24 | + | Löydät Fractions unitin | |
| 25 | + | ``` | |
| 26 | + | svn <https://lazarus-ccr.svn.sourceforge.net/svnroot/lazarus-ccr/components/fractions> | |
| 27 | + | ``` | |
| 13 | 28 | ||
| 14 | - | ||
| 29 | + | Tai voit vain katsella sitä viewcv:n avulla | |
| 30 | + | ``` | |
| 31 | + | <http://sourceforge.net/p/lazarus-ccr/svn/HEAD/tree/components/fractions/> | |
| 32 | + | ``` | |
| 15 | 33 | ||
| 16 | 34 | ## Ominaisuudet | |
| 17 | 35 | ||
| 18 | 36 | ### TFraction tyyppi | |
| 19 | 37 | ||
| 20 | - | ||
| 38 | + | TFraction on niin sanottu "advanced record": eli [[Record/fi|tietue]] laajennettuna [[Method|metodeilla]] ja [[Property|ominaisuuksilla (Property)]] . | |
| 21 | 39 | ||
| 22 | 40 | #### TFraction ominaisuudet | |
| 23 | 41 | ||
| 24 | - | ||
| 25 | - | ||
| 26 | - | ||
| 27 | - | ||
| 28 | - | ||
| 42 | + | * property Numerator: Int64; | |
| 43 | + | * Asettaa ja hakee murtoluvun osoittajan (jaettavan). | |
| 44 | + | * property Denominator: Int64; | |
| 45 | + | * Asettaa ja hakee murtoluvun nimittäjän (jakajan). | |
| 46 | + | * Jos jakajaa yritetään laittaa nollaksi (0) niin nostaa EZeroDivide poikkeuksen. | |
| 29 | 47 | ||
| 30 | 48 | #### TFraction metodit | |
| 31 | 49 | ||
| 32 | - | ||
| 33 | - | ||
| 34 | - | ||
| 35 | - | ||
| 36 | - | ||
| 37 | - | ||
| 38 | - | ||
| 39 | - | ||
| 50 | + | * procedure Normalize; | |
| 51 | + | * Supistaa murtoluvut jakamalla osoittajan ja nimittäjän [[Greatest common divisor/fi|suurimmalla yhteisellä tekijällä]], esim. murtoluvusta 10/5 tulee 2/1. | |
| 52 | + | * function ToString: String; | |
| 53 | + | * Palauttaa merkkijonoesityksen murtoluvusta (supistusta ei tehdä), esim. kun osoittaja on 10 ja nimittäjä on 5 niin funktio palauttaa '10/5'. | |
| 54 | + | * function Resolve: String; | |
| 55 | + | * Palauttaa merkkijonoesityksen murtoluvusta **supistamisen jälkeen** , esim. kun osoittaja on 4 ja nimittäjä on 3 niin funktio palauttaa '1 1/3'. | |
| 56 | + | * function ToFloat: Double; | |
| 57 | + | * Palauttaa liukuluku esityksen murtoluvusta, esim kun Numerator (osoittaja) = 1 ja Denominator (nimittäjä) = 3 niin funktio palauttaa 0.3333333333333 | |
| 40 | 58 | ||
| 59 | + | ||
| 60 | + | ||
| 41 | 61 | ### Murtolukujen tekeminen | |
| 42 | 62 | ||
| 43 | - | ||
| 44 | - | ||
| 45 | - | ||
| 46 | - | ||
| 63 | + | * function Fraction(ANumerator, ADenominator: Int64): TFraction; | |
| 64 | + | * Luo murtoluvun osoittaja/nimittäjä, esim. Fraction(1,2) tekee murtoluvun 1/2 (puoli). | |
| 65 | + | * function Fraction(AIntPart, ANumerator, ADenominator: Int64): TFraction; | |
| 66 | + | * Luo murtoluvun, esim. Fraction(1,1,2) antaa murtoluvun 1 1/2 (yksi ja puoli). | |
| 47 | 67 | ||
| 68 | + | ||
| 69 | + | ||
| 48 | 70 | ### Tuetut laskut | |
| 49 | 71 | ||
| 50 | 72 | #### Operaattorit (Overloaded operators) | |
| 51 | 73 | ||
| 52 | - | ||
| 53 | - | ||
| 54 | - | ||
| 55 | - | ||
| 56 | - | ||
| 57 | - | ||
| 58 | - | ||
| 59 | - | ||
| 60 | - | ||
| 61 | - | ||
| 62 | - | ||
| 63 | - | ||
| 64 | - | ||
| 65 | - | ||
| 66 | - | ||
| 67 | - | ||
| 68 | - | ||
| 69 | - | ||
| 70 | - | ||
| 71 | - | ||
| 72 | - | ||
| 73 | - | ||
| 74 | + | * = (yhtäsuuri) | |
| 75 | + | * < (pienempi kuin) | |
| 76 | + | * > (suurempi kuin) | |
| 77 | + | * <= (pienempi tai yhtäsuuri kuin) | |
| 78 | + | * >= (suurempi tai yhtäsuuri kuin) | |
| 79 | + | * := (saa arvokseen): Tämä sallii kokonaisluvun ( Int64 ) tai merkkijonon arvon antamisen muuttujalle | |
| 80 | + | * \+ (lisää) | |
| 81 | + | * \- (vähennä) | |
| 82 | + | * * (kertominen): overloaded for fractions and Int64 | |
| 83 | + | * / (jakolasku): overloaded for fractions and Int64 | |
| 84 | + | * ** (potenssiin korotus): only allowed for Integers (on right hand side) | |
| 74 | 85 | ||
| 75 | 86 | #### Matemaattiset funktiot | |
| 76 | 87 | ||
| 77 | - | ||
| 78 | - | ||
| 79 | - | ||
| 80 | - | ||
| 81 | - | ||
| 82 | - | ||
| 83 | - | ||
| 84 | - | ||
| 85 | - | ||
| 86 | - | ||
| 87 | - | ||
| 88 | - | ||
| 89 | - | ||
| 90 | - | ||
| 88 | + | * function Min(a, b: TFraction): TFraction; inline; overload; | |
| 89 | + | * Palauttaa a:n jos a <= b muuten palauttaa b:n. | |
| 90 | + | * function Max(a, b: TFraction): TFraction; inline; overload; | |
| 91 | + | * palauttaa a:n jos a >= b muuten palauttaa b:n. | |
| 92 | + | * function InRange(const AValue, AMin, AMax: TFraction): Boolean; inline; overload; | |
| 93 | + | * Palauttaa true:n jos AValue >= AMin ja AValue <= AMax muuten palauttaa false:n | |
| 94 | + | * function EnsureRange(const AValue, AMin, AMax: TFraction): TFraction; inline; overload; | |
| 95 | + | * Palauttaa AMin:n jos AValue < AMin muuten palauttaa AMax vain jos AValue > AMax muussa tapauksessa palauttaa AValue:n | |
| 96 | + | * function Sign(const AValue: TFraction): TValueSign; inline; overload; | |
| 97 | + | * Palauttaa NegativeValue:n jos AValue < 0 muuten palauttaa PositiveValue:n jos AValue > 0 muussa tapauksessa palauttaa AZeroValue:n | |
| 98 | + | * function IsZero(const AValue: TFraction): Boolean; overload; | |
| 99 | + | * Palauttaa true:n jos AValue on nolla (0) muuten palauttaa false:n. | |
| 100 | + | * function Abs(const AValue: TFraction): TFraction; overload; | |
| 101 | + | * Palauttaa AValue jos AValue >= 0 muuten palauttaa -1*AValue. | |
| 91 | 102 | ||
| 103 | + | ||
| 104 | + | ||
| 92 | 105 | ### Yleiskäyttöiset funktiot | |
| 93 | 106 | ||
| 94 | - | ||
| 95 | - | ||
| 96 | - | ||
| 97 | - | ||
| 107 | + | * function GreatestCommonDivisor(a, b: Int64): Int64; | |
| 108 | + | * Palauttaa lukujen a ja b [[Greatest common divisor/fi|suurimman yhteisen tekijän]]. | |
| 109 | + | * function Floor(D: Double): Int64; overload; | |
| 110 | + | * Palauttaa luvun D kokonaisosan (vähentää lukua yhdellä jos luku on pienempi kuin nolla). Niin sanottu lattiafunktio. | |
| 98 | 111 | ||
| 99 | 112 | ## Muunnos rutiinit | |
| 100 | 113 | ||
| 101 | - | ||
| 102 | - | ||
| 103 | - | ||
| 104 | - | ||
| 105 | - | ||
| 106 | - | ||
| 107 | - | ||
| 108 | - | ||
| 109 | - | ||
| 110 | - | ||
| 111 | - | ||
| 112 | - | ||
| 113 | - | ||
| 114 | - | ||
| 115 | - | ||
| 116 | - | ||
| 117 | - | ||
| 118 | - | ||
| 119 | - | ||
| 114 | + | * function FloatToFraction(Value, Precision: Double): TFraction; | |
| 115 | + | * Palauttaa Value:n likiarvon murtolukuna, esim. FloatTofraction(0.5,0.01) palauttaa 1/2 (puolikkaan) | |
| 116 | + | * Precision määrittää murtoluvun hyväksyttävän arvon. Hyväksyttävänä arvona pidetään arvoa joka on Abs(Result) - Abs(Value) <= Precision. | |
| 117 | + | * Precision määrittämiä suurusluokkia on 15. | |
| 118 | + | * FloatToFraction on tosiasiassa funktiomuuttuja joka on alustettu MF_FloatTofraction() funktiolla. Voit liittää sen tilalle jonkun muun funktion jos haluat. | |
| 119 | + | * function TryFloatToFraction(Value, Precision: Double; out F: TFraction; AcceptPrecisionError: Boolean): Boolean; | |
| 120 | + | * Palautettava murtoluku F riippuu annetusta AcceptPrecisionError arvosta: | |
| 121 | + | * Jos AcceptPrecisionError on True niin funktio palauttaa True:n jos likiarvo löydettiin | |
| 122 | + | * Jos AcceptPrecisionError on False niin funktio palauttaa True:n jos likiarvo löydettiin ja Abs(Abs(Result)-Abs(Value)) <= Precision | |
| 123 | + | * Palautettava murtoluku F on hyväsyttävissä ainoastaan silloin kun funktion palauttaa True:n | |
| 124 | + | * function FloatToFractionDef(Value, Precision: Double; Def: TFraction; AcceptPrecisionError: Boolean): TFraction; | |
| 125 | + | * Palauttaa Value:n likiarvon murtolukuna jos TryFloatToFraction(Value, Precision, F, AcceptPrecisionError: Boolean) onnistui, muuten palauttaa Def:n | |
| 126 | + | * function StrToFraction(const S: String): TFraction; | |
| 127 | + | * Palauttaa murtoluvun joka on merkkijonossa S, nostaa EConvertError poikkeuksen jos muunnos ei onnistu. | |
| 128 | + | * function TryStrToFraction(const S: String; out F: TFraction): Boolean; | |
| 129 | + | * Palauttaa True:n jos merkkijono S voidaan muuntaa murtoluvuksi F, muuten palauttaa False:n. | |
| 130 | + | * Palautettava murtoluku F on hyväsyttävissä ainoastaan silloin kun funktion palauttaa True:n. | |
| 131 | + | * function StrToFractionDef(const S: String; Def: TFraction): TFraction; | |
| 132 | + | * Palauttaa merkkijonon murtolukuna jos muunnos onnistuu, muuten palauttaa Def:n. | |
| 120 | 133 | ||
| 121 | 134 | ## Esimerkkiohjelma | |
| 122 | - | ||
| 123 | - | ||
| 124 | - | ||
| 135 | + | ``` | |
| 125 | 136 | program example; | |
| 126 | - | ||
| 127 | - | ||
| 128 | - | ||
| 129 | - | ||
| 130 | - | ||
| 131 | - | ||
| 132 | - | ||
| 133 | - | ||
| 134 | - | ||
| 135 | - | ||
| 136 | - | ||
| 137 | - | ||
| 138 | - | ||
| 139 | - | ||
| 140 | - | ||
| 141 | - | ||
| 142 | - | ||
| 143 | - | ||
| 144 | - | ||
| 145 | - | ||
| 146 | - | ||
| 147 | - | ||
| 148 | - | ||
| 149 | - | ||
| 150 | - | ||
| 151 | - | ||
| 152 | - | ||
| 153 | - | ||
| 154 | - | ||
| 155 | - | ||
| 156 | - | ||
| 157 | - | ||
| 158 | - | ||
| 159 | - | ||
| 160 | - | ||
| 161 | - | ||
| 162 | - | ||
| 163 | - | ||
| 164 | - | ||
| 165 | - | ||
| 166 | - | ||
| 167 | - | ||
| 137 | + | ||
| 138 | + | {$mode objfpc}{$H+} | |
| 139 | + | {$apptype console} | |
| 140 | + | ||
| 141 | + | uses | |
| 142 | + | Classes, sysutils, fractions, math; | |
| 143 | + | ||
| 144 | + | var | |
| 145 | + | F1, F2: TFraction; | |
| 146 | + | D, Prec: Double; | |
| 147 | + | i: Integer; | |
| 148 | + | begin | |
| 149 | + | F1 := Fraction(1,1,3); // 1 1/3 | |
| 150 | + | F2 := Fraction(4,3); // 4/3 | |
| 151 | + | writeln('F1.ToString = ',F1.ToString); // '4/3' | |
| 152 | + | writeln('F1.Resolve = ',F1.Resolve); // '1 1/3' | |
| 153 | + | writeln('F1.ToFloat = ',F1.ToFloat:16:16); // 1.3333333333333333 | |
| 154 | + | writeln('F2.ToString = ',F2.ToString); // '4/3' | |
| 155 | + | writeln('(F1 = F2) = ',F1=F2); //True | |
| 156 | + | ||
| 157 | + | F1 := Fraction(1,2); | |
| 158 | + | F2 := Fraction(1,3); | |
| 159 | + | writeln(F1.ToString,' * ',F2.ToString,' = ',(F1*F2).Resolve); // '1/6' | |
| 160 | + | writeln(F1.ToString,' / ',F2.ToString,' = ',(F1/F2).Resolve); // '1 1/2' | |
| 161 | + | writeln(F1.ToString,' + ',F2.ToString,' = ',(F1+F2).Resolve); // '5/6' | |
| 162 | + | writeln(F1.ToString,' - ',F2.ToString,' = ',(F1-F2).Resolve); // '1/6' | |
| 163 | + | writeln(F1.ToString,' ** 2 = ',(F1**2).Resolve); // '1/6' | |
| 164 | + | ||
| 165 | + | D := 0.25; | |
| 166 | + | F1 := FloatToFraction(D, 0.000001); | |
| 167 | + | writeln('FloatTofraction(0.25) -> ',F1.ToString); // '1/4' | |
| 168 | + | writeln; | |
| 169 | + | writeln('Approximations of Pi:'); | |
| 170 | + | writeln(' [Pi = ',Pi:16:16,']'); | |
| 171 | + | Prec := 1.0; | |
| 172 | + | for i := 1 to 10 do | |
| 173 | + | begin | |
| 174 | + | Prec := Prec / 10; | |
| 175 | + | F2 := FloatTofraction(Pi, Prec); | |
| 176 | + | writeln('FloatTofraction(Pi,',Prec:10:10,') = ',Format('%-13s',[F2.Resolve]),' [',F2.ToFloat:16:16,']'); | |
| 177 | + | end; | |
| 178 | + | end. | |
| 168 | 179 | ``` | |
| 169 | 180 | ||
| 170 | - | ||
| 171 | - | ||
| 172 | - | ||
| 181 | + | Ohjelma tulostaa: | |
| 182 | + | ``` | |
| 183 | + | F1.ToString = 4/3 | |
| 173 | 184 | F1.Resolve = 1 1/3 | |
| 174 | 185 | F1.ToFloat = 1.3333333333333333 | |
| 175 | 186 | F2.ToString = 4/3 | |
| 176 | 187 | (F1 = F2) = TRUE | |
| 177 | 188 | 1/2 * 1/3 = 1/6 | |
| 178 | 189 | 1/2 / 1/3 = 1 1/2 | |
| 179 | 190 | 1/2 + 1/3 = 5/6 | |
| 180 | 191 | 1/2 - 1/3 = 1/6 | |
| 181 | 192 | 1/2 ** 2 = 1/4 | |
| 182 | 193 | FloatTofraction(0.25) -> 1/4 | |
| 183 | - | ||
| 194 | + | ||
| 184 | 195 | Approximations of Pi: | |
| 185 | 196 | [Pi = 3.1415926535897932] | |
| 186 | 197 | FloatTofraction(Pi,0.1000000000) = 3 1/7 [3.1428571428571428] | |
| 187 | 198 | FloatTofraction(Pi,0.0100000000) = 3 1/7 [3.1428571428571428] | |
| 188 | 199 | FloatTofraction(Pi,0.0010000000) = 3 16/113 [3.1415929203539825] | |
| 189 | 200 | FloatTofraction(Pi,0.0001000000) = 3 16/113 [3.1415929203539825] | |
| 190 | 201 | FloatTofraction(Pi,0.0000100000) = 3 16/113 [3.1415929203539825] | |
| 191 | 202 | FloatTofraction(Pi,0.0000010000) = 3 16/113 [3.1415929203539825] | |
| 192 | 203 | FloatTofraction(Pi,0.0000001000) = 3 4703/33215 [3.1415926539214212] | |
| 193 | 204 | FloatTofraction(Pi,0.0000000100) = 3 4703/33215 [3.1415926539214212] | |
| 194 | 205 | FloatTofraction(Pi,0.0000000010) = 3 4703/33215 [3.1415926539214212] | |
| 195 | 206 | FloatTofraction(Pi,0.0000000001) = 3 14093/99532 [3.1415926536189365] | |
| 207 | + | ``` | |
| 196 | 208 | ||
| 197 | 209 | --- | |
| 198 | - | ||
| 210 | + | *From the Free Pascal wiki, page "Fractions/fi", as the Internet Archive kept it on 2022-07-04. Copyright stays with the author who wrote it, according to the old wiki's [[Licensing]] page. If you have concerns about this material, [message the admin](/wiki-contact).* |
