18. Premenné typu desatinné čísla (float), operácie

Desatinné čísla

Vo väčšine našich doterajších úlohách už od 1. časti učebnice sme pracovali s celými číslami, prípadne so znakovými reťazcami. Lenže pre mnohé úlohy, ktoré potrebujeme riešiť na počítači, nám celočíselná aritmetika nestačí. Zišli by sa nám aj desatinné čísla (v informatike sa tomu hovorí aj reálna aritmetika). Napr. celé čísla sme delili pomocou aritmetickej operácie //, napr.

>>> 22 // 7
3

ale ak sme omylom namiesto dvoch lomiek zapísali len jednu, dostali sme:

>>> 22 / 3
7.333333333333333

Táto operácia / totiž vždy vráti desatinné číslo aj v prípade, že výsledok je delenie bez zvyšku, napr.

>>> 21 / 3
7.0

Desatinné čísla v Pythone sú teda také čísla, ktoré obsahujú desatinnú bodku (nie čiarku) alebo sú v tzv. vedeckom zápise (niekedy semilogaritmický tvar). Ukážme to na príklade:

>>> 3.14000
3.14
>>> 314e-2
3.14
>>> 0.0314e2
3.14

Všetky tri zápisy reprezentujú to isté desatinné číslo 3.14. Druhý a tretí zápis obsahujú písmeno e, ktoré označuje, že za ním sa nachádza celočíselný exponent. Výsledné desatinné číslo získame tak, že zoberieme časť pred písmenom e (tzv. mantisa) a vynásobíme ho mocninou čísla 10 exponentom, ktorý je za písmenom e. Preto napr.

314e-2    označuje   314 * 10 ** -2

0.0314e2  označuje   0.0314 * 10 ** 2

Tento vedecký zápis čísel budeme používať veľmi zriedkavo. Častejšie to budú desatinné čísla bez písmena e.

Operácie s desatinnými číslami

Všetky operácie, ktoré fungovali s celými číslami, budú fungovať aj pre desatinné čísla. Platí tu jedno pravidlo, keď je aspoň jeden z operandov desatinné číslo, tak aj výsledok je desatinné číslo (zrejme okrem /, pri ktorom je výsledok vždy desatinné číslo). Preveríme to v interaktívnom režime:

>>> 123.0 + 456
579.0
>>> 1234 * 5678
7006652
>>> 1234. * 5678
7006652.0
>>> 1000 // 7
142
>>> 1000.0 // 7
142.0
>>> 1000 / 7
142.85714285714286

Desatinné čísla ale nemajú takú presnosť ako celé. Počítač si pri desatinných číslach pamätá len istý rozsah (približne 16 až 17 cifier), preto môžu byť niektoré výpočty dosť nepresné. Napr.

>>> 10000000000000000000000000 + 1
10000000000000000000000001
>>> 10000000000000000000000000 + 1.
1e+25
>>> 2 ** 100
1267650600228229401496703205376
>>> 2.0 ** 100
1.2676506002282294e+30
>>> 2 ** 100
1267650600228229401496703205376
>>> 2.0 ** 100
1.2676506002282294e+30
>>> 0.1 + 0.1 + 0.1
0.30000000000000004

Preto si treba vždy pri práci s desatinnými číslami uvedomiť, že tieto výpočty môžu byť naozaj nepresné.

Zaujímavé sú aj mocniny s desatinnými číslami. Napr. umocniť nejaké číslo na 1/2 (jednu polovicu) v skutočnosti označuje druhú odmocninu čísla. Napr.

>>> 2 ** (1/2)
1.4142135623730951
>>> 2 ** 1/2
1.0
>>> 25 ** .5
5.0
>>> 27 ** (1/3)
3.0

Na tomto príklade vidíte, že ak je exponentom pri umocňovaní nejaký výraz, musí sa uzavrieť do zátvoriek. Napr. 2 ** 1/2 označuje, že najprv sa vykonalo umocnenie 2 ** 1 a potom sa tento výsledok vydelil 2. Posledný príklad 27 ** (1/3) ukazuje tretiu odmocninu čísla 27.

Ukážme teraz výpočet tohto súčtu:

1 + 1/2 + 1/3 + 1/4 + ... + 1/1000

Použijeme na to for-cyklus, v ktorom premenná cyklu bude nadobúdať hodnoty od 1 do 1000 a k nejakému súčtu budeme pripočitávať prevrátenú hodnotu premennej cyklu (1 / cislo). Zapíšme:

sucet = 0
for cislo in reversed(range(1, 1001)):
    sucet = sucet + 1 / cislo
print('vysledok =', sucet)

Dostávame výsledok:

vysledok = 7.485470860550343

Úlohy

  1. Napíšte program, ktorý prečíta dve čísla a vypíše ich priemer. Napr.

    zadaj prve cislo: 15
    zadaj druhe cislo: 3.8
    priemer tychto dvoch cisel je 9.4
    
  2. Napíšte podprogram sucet. ktorý pre daný parameter n vypočíta súčet prevrátených mocnín 2, t.j.

    1/1 + 1/2 + 1/4 + 1/8 + 1/16 + 1/32 + ... 1/2**n
    

Paralené priraďovanie

Na záver tejto časti ukážeme ďalšie možnosti priraďovacieho príkazu. Doteraz sme používali priradenie v tomto tvare:

premenná = hodnota

pri ktorom sa najprv vyhodnotila hodnota na pravej strane za znakom = (mohola to byť konštanta, premenná alebo aj zložitejší výraz) a táto hodnota sa priradila do danej premennej na ľavej strane priradenia. Videli sme, že takéto priradenie funguje napr. aj v tvare:

a = a + 1                      # zvýši premennú a o 1
sucet = sucet + cislo          # zvýši premennú sucet o hodnotu premennej cislo
veta = veta + 'abc'            # pridá na koniec reťazca veta reťazec 'abc'
xy = 2 * xy + '.'              # zdvojí obsah reťazca v premennej xy a pridá k tomu '.'

Vo všetkých týchto prípadoch sa na pravej strane vyskytla tá istá premenná, do ktorej sa potom priradí výsledok.

Lenže priradenie môžeme vylepšiť ešte takto:

premenná1, premenná2 = hodnota1, hodnota2

Toto označuje, že najprv sa vyhodnotia obe hodnoty za znakom = a potom sa obe tieto hodnoty priradia do zadaných premenných. Tychto premenných a potom aj výrazov môže byť aj viac, jediná podmienka je, že ich bude na oboch stranách rovnaký počet. Pozrime:

x, y = 100, 150
sirka, vyska = 10, 8
a, b, c = 1, 4, 2
meno, priezvisko = 'Janko', 'Hrasko'

Vo všetkých prípadoch sme paralelne priradili do viacerých premenných rôzne hodnoty. Stačí si uvedomiť, že v týchto prípadoch, napr.

x, y = 100, 150

označuje:

x = 100
y = 150

Výmena dvoch alebo viacerých hodnôt:

a, b = b, a
a, b, c = b, c, a