C2) Exponenciální znaková položka Elementární položka se nazývá exponenciální znaková, pokud má klauzuli PICTURE, přičemž vzor má tvar {+|-}[devítky][.|V][devítky]E{+|-}99 kde "devítky" znamenají posloupnost znaků 9. Celkový počet znaků 9 stojících vlevo od znaku E musí být alespoň 1 a nejvýše 18. Místo E lze psát e a místo V lze psát v. Příklad: Následující vzory jsou přípustné vzory exponenciálních znakových položek: -9E-99 -9VE+99 -999999.E-99 -999E+99 +V9(18)E-99 +.9(18)E+99 +9(18)E+99 -99V9(8)E-99 -9(4).9(12)E+99 -999e+99 +9.9(7)e+99 +9(17)v9e-99 Následující vzory jsou nepřípustné: +9.999D+99 (místo povinného E je zde D) 99.9E+99 (chybí znaménko mantisy) +99V9E99 (chybí znaménko exponentu) +9.99E+9 (exponent nemá přesně dvě devítky) +9.99E-999 (exponent nemá přesně dvě devítky) +.E-99 (mantisa nemá ani jednu devítku) -9(3)V9(16)E-99 (mantisa má více než 18 devítek) +9(3).9(5)+99 (chybí povinný znak E) +9999PPPVE+99 (mantisa obsahuje znaky P) Pravidla: 1) Části vzoru před znakem E říkáme mantisa, části vzoru za znakem E říkáme exponent. 2) Každému znaku vzoru s výjimkou znaku V (tedy i oběma znaménkům, tečce a písmenu E) je přidělen jeden byte paměti. Délka exponenciální znakové položky je tedy rovna počtu znaků ve vzoru s výjimkou znaku V. 3) Znak V nebo tečka v mantise označuje polohu výpočtové (myšlené) desetinné tečky mantisy. Je-li uvedena tečka, je jí navíc přidělen jeden byte paměti, na nějž bude při naplňování exponenciální znakové položky vždy dosazen znak tečka (.). Není-li ve vzoru uvedeno ani V ani tečka, považuje se mantisa za celočíselnou (jakoby bylo V vloženo mezi poslední 9 v mantise a znak E). 4) Numerická hodnota uložená v exponenciální znakové položce je rovna součinu hodnoty mantisy a čísla 10 umocněného na hodnotu exponentu, tj. hodnota = mantisa * (10 ** exponent). 5) Je-li exponenciální znaková položka použita jako příjmová položka v numerickém přesunu nebo v některém aritmetickém příkazu, bude po jejím naplnění úsek paměti přidělený této položce obsahovat vysílající numerickou hodnotu ve tvaru vyhovujícím vzorci z bodu 4, přičemž navíc budou splněny následující podmínky: a) Není-li vysílající hodnota nulová, provádí se tzv. normalizace mantisy: první cifra mantisy zleva bude nenulová (tímto pravidlem je až na případné zaokrouhlení mantisy jednoznačně určena mantisa i exponent). b) Je-li hodnota mantisy resp. exponentu nezáporná, bude do bytu přiděleného znaménku mantisy resp. exponentu dosazen znak + (je-li ve vzoru u mantisy resp. exponentu znaménko +) anebo mezera (je-li ve vzoru u mantisy resp. exponentu znaménko -). c) Je-li hodnota mantisy resp. exponentu záporná, bude do bytu přiděleného znaménko mantisy resp. exponentu dosazen vždy znak - (nezávisle na tom, zda ve vzoru je u mantisy resp. exponentu znaménko + nebo -). d) Je-li vysílající hodnota a tedy i hodnota mantisy nulová, bude dosazen i nulový exponent ("+00" nebo " 00 podle toho, zda ve vzoru je u exponentu znaménko + nebo -). e) Je-li ve vzoru uvedena tečka, bude na byte paměti jí odpovídající dosazen znak tečka (.). f) Na byte paměti odpovídající písmenu E resp. e ve vzoru bude dosazeno písmeno E (vždy velké). 6) Pokud naplnění úseku paměti odpovídajícího exponenciální znakové položce zajišťuje uživatel jiným způsobem (např. načtením ze vstupního souboru dat nebo postupným naplňováním v paměti za pomoci redefinice nebo příkazu STRING apod.) a tato položka je pak použita jako vysílající položka v numerickém přesunu nebo jako operand v aritmetickém výrazu nebo v některém aritmetickém příkazu, nevyžaduje a nekontroluje se splnění podmínek a) až f) z bodu 5. Pro správné získání hodnoty položky stačí, aby a) na všech bytech, jímž ve vzoru odpovídají znaky 9, byly skutečné znakové číslice 0 až 9 (s případnou výjimkou u prvního bytu exponentu, viz bod 9), a aby b) na bytu přiděleném znaménku mantisy a na bytu přiděleném znaménku exponentu byl znak - při záporné hodnotě mantisy resp. exponentu anebo jakýkoliv znak jiný než - při kladné hodnotě. (Při nezáporné hodnotě lze tedy použít znak + nebo mezeru anebo dokonce i jakýkoliv jiný znak mimo - nezávisle na tom, zda ve vzoru je uveden znak + nebo -; při nulové hodnotě lze použít libovolný znak včetně znaménka -). Normalizace mantisy se nepožaduje, při nulové mantise se nulový exponent rovněž nepožaduje, přítomnost tečky a písmene E resp. e se nekontroluje. 7) Exponenciální znaková položka patří mezi numerické položky, takže může být použita všude tam, kde formát povoluje neceločíselnou numerickou položku. Práce s exponenciální znakovou položkou se ovšem vždy realizuje pomocí sice přesných, leč velmi pomalých podprogramů, které převádějí její hodnotu do pomocné exponenciální dlouhé položky nebo naopak. Vedlo by proto ke značným časovým ztrátám, kdyby exponenciální znaková položka vstupovala do numerických operací nebo přesunů vícekrát než je nezbytně nutné anebo kdyby dokonce sloužila jako mezivýsledek. Jediným důvodem pro zavedení exponenciálních znakových položek do jazyka COBOL je umožnit tisknutelný a čitelný vstup a výstup exponenciálních údajů. Proto je rozumné používat exponenciální znakové položky pouze ve vstupních a výstupních logických větách a v položkách načítaných příkazem ACCEPT resp. tisknutých příkazem DISPLAY resp. EXHIBIT a pracovat s každou exponenciální znakovou položkou pouze jedenkrát pro jeden příkaz vstupu/výstupu. Potřebujeme-li využívat hodnotu exponenciální znakové položky vícekrát, je vhodné ji po přečtení ze vstupního souboru explicitně přesunout do pracovní exponenciální dlouhé položky a v příslušných numerických operacích a přesunech pak používat tuto pracovní exponenciální dlouhou položku. 8) Aby bylo možné provést přesun exponenciální znakové položky do exponenciální dlouhé položky (kterýžto přesun se vždy provádí při jakémkoliv využívání hodnoty exponenciální znakové položky, viz bod 7), nesmí být absolutní hodnota exponenciální znakové položky větší než největší možná hodnota exponenciální dlouhé položky (na EC: 7.237*(10**75)); jinak dojde k chybnému výpočtu nebo dokonce k havárii výpočtu. Pokud by absolutní hodnota exponenciální znakové položky byla menší než nejmenší možná kladná hodnota exponenciální dlouhé položky (na EC: 5.398*(10**(-79))), bude zpracována jako nulová. 9) Na některých počítačích (např. PC) může typ "double" (tj. exponenciální dlouhá položka) pojmout i tak velké číslo, že mu v exponenciálním znakovém tvaru odpovídá exponent větší než 99 (resp. menší než -99). V takovém případě se po přesunu takové exponenciální dlouhé položky do exponenciální znakové položky objeví na prvním bytu exponentu exponenciální znakové položky znak, jehož ASCII-kód je roven ASCII-kódu znaku 0 (hex. 30) zvětšenému o absolutní hodnotu exponentu celočíselně dělenou 10 (např. E+:4 pro exponent +104, E-<7 pro exponent -127, E+?0 pro exponent +150, E-A8 pro exponent -178 atd.). Takovéto obsazení bude řádně zpracováno též při převodu z exponenciální znakové položky do exponenciální dlouhé položky a bude též považováno za přípustné v testu NUMERIC. Nelze však exponent větší než 99 nebo menší než -99 zapsat u numerického literálu v exponenciálním tvaru. Příklad: V "obsahu" se na místě mezery uvádí písmeno b. PICTURE vysíl.hodnota obsah (normalizovaný) ----------------------------------------------------------- +99.9E+99 -0.00534 -53.4E-04 -9.999E+99 840000 b8.400E+05 -9.999E+99 0 b0.000E+00 -9(12)VE+99 5 b500000000000E-11 +9.9(5)E+99 5 +5.00000E+00 -99V99E-99 0.573*10**24 b5730Eb22 -.9(7)E+99 -639*10**-52 -.6390000E-49 +9E-99 1000000 +1Eb06 +9E-99 0.000001 +1E-06