\"/
\"/ \"/    

Čekání na 01-01-00 (1)

Jana Kohoutková, ÚVT MU
Ročník V - číslo 4, březen 1995
Citace: J. Kohoutková. Čekání na 01-01-00 (1). Zpravodaj ÚVT MU. ISSN 1212-0901, 1995, roč. V, č. 4, s. 12-14.
Tematické zařazení: Různé
 předchozí článek | následující článek 

Nezadržitelný tok času lemují některé významnější kalendářní milníky. To je skutečnost, s níž jsme se všichni seznámili už kdysi v dobách dětství - například když jsme se poprvé vědomě přenesli přes změnu desetiletí - a která by nás tudíž neměla nijak zvlášť zaskočit. Možná nás při některé změně desetiletí mimochodem napadlo, že tak jako postupně zastarávají nejrůznější formuláře s předtištěným 195_, 196_, ..., zastarají jednou i formuláře, které si žádají vyplnění 19__. To "jednou" nastane již docela brzy: s příchodem druhého tisíciletí.

Kalendářní milník v podobě počátku nového tisíciletí se k nám blíží neotřesitelně stálou rychlostí 3600 sekund v hodině. Jen necelých pět let nás dělí od jisté páteční noci, která jedním rázem ukončí měsíc, rok, desetiletí, století a tisíciletí. Následujícího sobotního rána to nebudou jen předtištěné formuláře, které najednou zastarají. Ke všem přeměnám, jež lze na úsvitu nového věku očekávat, se velmi pravděpodobně zařadí i řada takových, které budou mít na svědomí - počítače. Předběhněme teď poněkud a podívejme se na ně, byť hypoteticky, blíže: pohledem, který v American Scientist 83/1 publikoval Brian Haynes.

Dny první

Krátce po půlnoci 1. ledna 2000 začne program, který automaticky zálohuje počítačové soubory, nahrazovat dokumenty datované 01-01-00 verzemi z 12-31-99 a staršími. Nejinak se zachová i nástroj, který automaticky sestavuje nejnovější složky právě vyvíjeného softwaru: začne z ničeho nic přibírat zastaralé moduly.

Mnohé počítače, nevědouce, že nastal rok 2000, budou interpretovat 01-01-00 jako první den roku 1900, tedy jako pondělí, nikoli sobotu. Výsledek? Dopravní signalizace aškolní zvonění budou pracovat jako o pracovních dnech a na železničních stanicích budou displeje ohlašovat příjezdy a odjezdy pondělních dělnických vlaků. Tu a tam bude vyloupena nějaká ta banka, jejíž časový zámek nečekaně vypoví a dovolí, aby se sejf otevřel i v sobotu.

Na letištích budou zrušeny všechny lety. Počítač v oddělení údržby totiž nepovolí start žádnému letadlu, protože zjistí, že všem strojům vypršela lhůta pro generální opravy trupu i motorů již před 99 lety. Navíc se ještě ukáže, že někteří piloti jsou ve službě plných 875.000 hodin, čímž porušili pracovní řád jak odborů, tak Federální letecké agentury.

V místní mlékárně, kde se vždy nejdříve expeduje nejstarší mléko, bude mít v prvních týdnech nového tisíciletí přednost mléko z roku 00. Veškeré zbylé mléko z roku 1999 se své expedice dočká až koncem roku 2099. Ve stejné době odhalí počítač v pekárně na opačném konci města, že chléb datovaný 01-01-00 je starý celé jedno století, a nařídí jej vyřadit z prodeje.

Při prvním otevření počítačového diáře vaší laboratoře vám software povýšeně sdělí, že časové značky položek musí trvale narůstat. A poté vás nařkne, že svévolně manipulujete se systémovými hodinami.

Až se vám dostane do rukou první bankovní výpis z nového roku, překvapí vás, že transakce jsou vypsány v podivném, nikoli chronologickém pořadí: ty z roku 2000 předcházejí transakcím datovaným 1999. Navíc zjistíte, že úložka ve výši $ 1000 z konce prosince se zúročovala téměř 100 let, takže vynesla plných $ 400.000. Ale pozor, nespěchejte ten snadný výdělek hned utratit: na druhý den totiž ze svého VISA výpisu zjistíte, že dlužíte 136 milionů dolaru. A co teprve až přijde účet za telefon: to novoroční telefonické přání všeho dobrého, které jste domněle rychle vyřídili těsně před půlnocí, účetně trvalo 53 milionů minut. Ke všemu ještě vám pošle upomínku knihovna, protože vážným způsobem porušujete její výpůjční lhůty.

Kdo uteče, neprohraje

Tyto a jim podobné události s úzkostí - ale i se špetkou uličnické škodolibosti, pokud nebude nikomu ublíženo - očekává skupina počítačových odborníků zaměřených na rizika informačních technologií. Jejich hlavním sněmovním místem je Risks Forum, což je moderovaný internetovský mailing list a usenet news skupina (comp.risks) zároveň. V tomto fóru patří témata slabých stránek počítačových hodin a kalendářů k nejoblíbenějším. Většina výše zmíněných imaginárních kalamit je založena na spekulacích publikovaných v Risks za posledních několik let. Skutečně, rizika spojená s datem 01-01-00 byla v tomto fóru předpovídána tak často, že jeden z přispěvatelů navrhl všem těm, kteří chtějí uniknout možným škodám spojeným s "přetočením" kalendáře, vydat se na speciální výlet přelomu tisiciletí. Zatímco mnozí uvíznou na zemi, hádajíce se, zda 21. století začíná rokem 2000 nebo rokem 2001, obezřelí čtenáři Risks Fora se vytratí, nastoupí na palubu letadla s výhradně ne-elektronickým řízením a výhradně ne-počítačovým navigačním vybavením a potizim jednoduše uletí.

Většinu citovaných problémů má na svědomí skutečnost, že v počítači se kalendářní data obvykle reprezentují pouze šesti číslicemi, tedy způsobem vyčleňujícím na určení roku pouze dvě číslice. Každý program, který na tuto reprezentaci přistoupí, je nutně odsouzen pouze ke stoleté životnosti: většinou jsou roky 00 až 99 interpretovány jako 1900 až 1999. Když se kalendář přetočí z 99 na 00, nepokročí datum do nového století, ale vrátí se k roku 1900. Počítače spoléhajíci se na kalendář tohoto druhu jsou odsouzeny znovu a znovu opakovat 20. století; žijí v cyklickém vesmíru, kde se budoucnost stáčí do minulosti.

Pojmy "před" a "po" jsou v takovém světě kruhové. Chronologické třídění bankovních transakcí nebo kartonů mléka proto nevyhnutelně přinese na přelomu století některé podivné výsledky. Podobně by Úřad pro životní statistiku neměl být překvapen, když ode dneška za několik let začne zaznamenávat celou generaci nově narozených dětí, které budou starší než jejich rodiče a prarodiče. Všechno jsou to prosté důsledky kruhového kalendáře, v němž platí 99+1=00 při zachování 00<99.

Jestliže je aritmetika komplexnější než pouhé numerické porovnání, závisí přesný důsledek přetočení kalendáře na tom, jak je tato aritmetika prováděna v detailech. Uvažme příklad banky, která vypočítává úrok ze sumy uložené 12-20-99 a vybrané 01-10-00. Výsledkem odečtení 12-20-99 od 01-10-00 by mělo být necelých -100 let, přesněji -36503 dní. Nad tím by se ovšem měl počítač zarazit: v daném kontextu znamená totiž záporný výsledek nesmysl. Dobře napsaný program podobné možnosti prověřuje, a narazí-li na zápornou hodnotu, zastaví a hlásí chybu. Dokonce i bez přesné kontroly chyb může záporný počet dní způsobit zastavení programu; například když se program pokusi vyčíslit logaritmus tohoto čísla, což je nedefinovaná operace. Nečekaná záporná hodnota může vyvolat i zcela protikladnou reakci, totiž že se program namísto zastavení nekonečně zacyklí. Všechny tyto případy mají jedno společné: program s konečnou platností odmítne dát odpověď, což může být za daných okolností ten nejméně závažný chybový stav.

Dalších možných výsledků je celá řada. Protože se nepočítalo se zápornou periodou úložky, mohl programátor napsat proceduru vyčíslující úrok tak, aby ignorovala znaménko výsledku odečítání dat. (V několika z výše uvedených hypotetických příkladů jsme předpokládali právě tento druh aritmetiky.) Podobným, jen mírně odlišným přístupem je provádět aritmetické operace s celými čísly bez znaménka, mezi nimiž záporná čísla prostě neexistují. V jedné běžné implementaci počítačové aritmetiky bez znaménka se 0-99 rovná 65437; použije-li vaše banka pro výpočet úroku právě tento počet let, měla by si na výpisu pro vás rezervovat dost místa: objeví se tam totiž 1650-znaková částka (v dolarech).

Jinou možností je přenášet s sebou záporné znaménko po celou dobu výpočtu, takže konečným výsledkem je připsání úroku ve výši řekněme $ -397000. I tento výsledek v sobě skrývá určitou logiku: banka jej chápe tak, že v roce 1900 byly peníze vybrány a až do roku 1999 nebyly na účet vráceny. Naštěstí vám mohou na druhou účetní stranu přejít i úroky ze zůstatků kreditních karet a půjček, takže celkový výsledek vaše ztráty pohádkově vynahradí.

Ještě jinou variantou může být použití záporného čísla v exponentu vzorce pro výpočet složeného úroku. V tomto případě se jak aktiva, tak pasiva rozplynou do triviálních částek: při -6% ročně se úložka $ 1000 zredukuje na $ 2.95. A ještě jedna radostná vyhlídka: jestliže se falešná záporná hodnota vplíží do výpočtu dvakrát, stane se váš úrok buď debetem nebo kreditem v závislosti na tom, zda jste měli peníze uloženy lichý nebo sudý počet dní.

Existují ještě další a další způsoby, jak tyto zdánlivě jednoduché výpočty dokonale zkreslit. Většina počítačové aritmetiky se provádí se 16-bitovými čísly, kterými lze vyjádřit celkem 65536 (2^16) různých hodnot. V souladu s rozšířenou zvyklostí se v 16-bitové aritmetice celá čísla od 0 do 32767 reprezentují přímo, zatímco zbývající hodnoty se interpretují jako záporná celá čísla od -32767 do -1. Těch 36503 dní mezi 01-10-00 a 12-20-99 tedy v tomto systému překračuje maximální kladnou hodnotu, takže budou interpretovány jako záporné číslo, konkrétně -29033.

Vymýšlet si na tomto místě další a další chybové mechanismy by nebyl žádný problém. Skutečně to vypadá, že při dostatečné vynalézavosti by se dal podobnými kalkulacemi získat zdánlivě jakýkoli výsledek - dokonce i ten správný. Je tedy velká šance, že většina programů na většině počítačů bude i v novém tisíciletí pracovat normálně. Ale zároveň je jisté, že toho sobotního rána ode dneška za pět let nejrůznější nepředvídané situace jen jen pokvetou.

(... pokračování)
Zpět na začátek
ÚVT MU, poslední změna 14.11.2011