Programování pro fyziky 2022/23 – přednáška č. 5

Co bylo a co bude

Na předchozí přednášce jsme pokročili s imperativním strukturovaným programováním, podívali se na obvyklé příkazy pro vstup a výstup dat a ukázali si obecný aparát operačních systémů pro vstup a výstup dat do souborů. Dnes se zahloubáme do vlastností standardních datových typů a budeme s jejich využitím konstruovat výrazy.

Hádanky

Zahájíme hádankami. Odpovědět na ně si zkuste naostro hned, a pak během přednášky případně odpovědi zpřesňujte. (Jak jsme už pozorovali, v různých jazycích a v různých kontextech mohou existovat různé odpovědi.)

  1. Co provede výpis literálu 12345678901234567890?

  2. Co provede výpis literálu 12345678901234567890.?

  3. Co provede výpis literálu 16777217.?

  4. Co provede výpis literálů 00, 007, 010?

  5. Je rozdíl mezi zápisy 0.5 a 1/2, 0.1 a 1/10?

  6. Jak přesné jsou v počítačích reprezentace zlomků 1/2, 1/3, 1/4 a 1/10?

  7. Co je tak jiného na literálech 1e300 a 1e400? (Existují vůbec?)

  8. Co je výsledkem relace +0==-0? Co je výsledkem relace +0.==-0.? (Jsou vůbec operandy různé?)

  9. Co provede volání funkce sqrt(-1)? A sqrt(-1.)? (Jak odmocnit komplexní -1?)

  10. Co je víc, true nebo false? (Co je výsledkem relace true>false?)

  11. Co je víc, A nebo a? (Co je výsledkem relace 'A'>'a'?)

  12. Je (na počítačích) více celých čísel nebo reálných čísel?

Odpovědi za Fortran může kromě obvyklé cesty (překladače GNU, Intel, Nvidia) poskytnout i lfortran (LLVM-based Fortran) a jeho webové rozhraní, dílo českého matfyzáka, dokonce fyzika. Webových rozhraní ke klasickým překladačům online je samozřejmě více.

Standardní datové typy

Dnes budeme pracovat s kapitolou Standardní datové typy našich poznámek k přednášce.

Interní reprezentace celých čísel

Uložení celých čísel v paměti připomíná zápis v dvojkové soustavě, např. \(0101 = 2^2+2^0 = 5\). Bity \(f_k\) o hodnotách 0 nebo 1 se pro \(p\)-bitový neznaménkový integer interpretují podle vzorce \(\sum_{k=1}^p f_k\cdot2^{k-1}\) a pro \(p\)-bitový znaménkový integer při \(f_p=0\) jako nezáporná čísla \(\sum_{k=1}^{p-1} f_k\cdot2^{k-1}\) a při \(f_p=1\) jako záporná čísla \(-2^{p-1}+\sum_{k=1}^{p-1}f_k\cdot2^{k-1}\). V příkladu výše jsou číslice \(f_k\) zapsány po řadě zprava doleva.

Odkazy: reprezentace celých čísel na Wikipedii nebo jinde

Interní reprezentace reálných čísel

Jsou vhodné k aproximaci reálných čísel. Jejich podobu ukotvila norma IEEE 754, v procesorech respektovaná. Popisuje čísla v semilogaritmickém tvaru o dvojkovém základu \(\displaystyle (-1)^s\cdot M\cdot 2^E\), kde \(s\) je znaménkový bit o hodnotách 0 nebo 1, mantisa \(\displaystyle M=1+\sum_{k=1}^{p-1} f_k\cdot \left(\frac12\right)^{k}\) a \(E\) je celočíselný exponent v mezích \(\langle E_{\min},E_{\max}\rangle\). Bity \(f_k\) nabývají hodnot 0 nebo 1, \(f_0\) je vždy 1 a je \(1\le M<2\).

Reprezentovaná čísla mají omezenou přesnost mantisy a omezený rozsah exponentu, zachycují tedy jen některá reálná, přesněji racionální čísla, a někdy se jim raději než reálná říká „floating point“, čísla s plovoucí (binární) tečkou. Norma definuje několik formátů (přesností), daných celkovým počtem bitů čísla, počtem \(p\) bitů mantisy a rozsahem exponentů. Procesory nejčastěji implementují přesnost jednoduchou (4bytovou) a dvojitou (8bytovou) a zatím zřídka čtyřnásobnou (16bytovou), někdy je dostupná i dvojitá rozšířená (10bytová) přesnost. Stojí za zvýraznění, že v reálných typech lze ukládat přesně zlomky (a součty zlomků) s mocninami dvou ve jmenovateli, např. 1/2, 3/4, nikoliv však např. 1/3 nebo 1/10.

Přesnost mantisy a rozsah exponentu jsou definovány v dvojkové soustavě, člověk je pozoruje v desítkové soustavě:

real

celkem

mantisa

exponent

precision

bytů

bitů

p bitů

epsilon

platných míst

dvojkově

desítkově

single

4

32

24

\(2^{-23}\ \approx1\cdot10^{-7}\)

7,22

–126..127

–45..38

double

8

64

53

\(2^{-52}\ \approx2\cdot10^{-16}\)

15,95

–1022..1023

–324..308

double extended

10

80

64

\(2^{-63}\ \approx1\cdot10^{-19}\)

19,27

–16382…16383

–4951..4932

quadruple

16

128

113

\(2^{-112} \approx2\cdot10^{-34}\)

34,02

–16382…16383

–4951..4932

Relativní přesnost (též počítačové epsilon) chápeme jako nejmenší číslo, jehož přičtením či odečtením lze změnit jedničku, a při \(p\)-bitové mantise se rovná \(2^{1-p}\). Počtem platných míst v desítkové soustavě pak myslíme hodnotu \(P=p\log_{10} 2\) plynoucí ze vztahu \(10^{-P}=2^{-p}\). Největší single hodnota je \(\sum_{k=0}^{23}(\frac12)^k\cdot2^{127}\), přibližně 3.4e38, a pro double \(\sum_{k=0}^{52}(\frac12)^k\cdot2^{1023}\) ~ 1.8e308, nejmenší řádnou kladnou hodnotou je single \(1\cdot2^{-126}\) ~ 1.2e-38 a double \(1\cdot2^{-1022}\) ~ 2.2e-308. Lze pracovat i s čísly s menší než řádnou kladnou hodnotou, tj. s \(f_0=0\). Nejmenším kladným z nich je v single přesnosti \((\frac12)^{23}\cdot2^{-126}\) ~ 1.4e-45, v double \((\frac12)^{52}\cdot2^{-1022}\) ~ 4.9e-324.

Odkazy: reprezentace reálných čísel na Wikipedii a konvertor

Výrazy

Pokračujeme s kapitolou Výrazy poznámek k přednášce.

Hádanky

  1. Je + a * komutativní?

  2. Je + a * asociativní?

  3. Je 1/3 totéž co 1./3.?

  4. Je 1+2*3 totéž co 1+(2*3)?

  5. Je 2**3**2 rovno 64 nebo 512?

  6. Je 1/3+1/3+1/3 rovno 1? Je 1./3+1/3+1/3 rovno 1? Je 1./3+1./3+1./3 rovno 1?

  7. Je 0.1+0.1=0.2 rovno true? Je 0.1+0.1+0.1=0.3 rovno true?