# XBUP - Knihovna UBNumber

### Úvod

Tento dokument je součástí dokumentace projektu eXtensible Binary Universal Protocol. Obsahuje popis implementací podpory, především knihoven, nástrojů a demonstračních aplikací.

O úroveň výše

### Obsah

1. Úvod
2. Vlastní třídy knihovny UBNumber
2.1. Třída UBNumber
2.2. Třída UBNatural
2.3. Třída UBInteger
2.4. Třída UBReal
2.5. Třída UBRatio
2.6. Třída UBENatural
2.7. Třída UBEInteger
2.8. Třída UBEReal
3. Demonstrační programy
3.1. Demo program
3.2. Jednoduchá kalkulačka

### 1. Úvod

Knihovna UBNumber implementuje podporu neomezeně velkých čísel s konečnou reprezentací, především s ohledem na konverzi do a z binárního/datového proudu.

Níže popsaná varianta knihovny je naprogramována v programovacím prostředí Borland Delphi. V tomto jazyce se autorovi nepodařilo nalézt žádnou jinou knihovnu podporující tak velké čísla, a proto se rozhodl implementovat tuto podporu sám. Primárním cílem je však funkčnost a nikoli výkon. Proto je tato knihovna neoptimalizovaná.

### 2. Vlastní třídy knihovny UBNumber

Vlastní třídy implementují vlastní funkcionalitu jednotky. Rodičovskou třídou je UBNumber a další třídy jsou jejími potomky. K dispozici by dále měly být další třídy pro realizaci nekonečného proudu, seznamu, ...

### 2.1. Třída UBNumber

Toto je rodičovská třída všech tříd reprezentujících hodnoty v unárně-binárním kódování. Implementuje pouze funkce LoadFromStream a SaveToStream, které umožňují ukládání do datového proudu.

LoadFromStream

Přečte a zahodí právě jednu hodnotu z proudu.

SaveToStream

Uloží do proudu hodnotu 0.

### 2.2. Třída UBNatural

Tato třída implementuje neomezeně velké celé kladné - nezáporné číslo.

Inc - Zvýší hodnotu o 1

Dec - Sníží hodnotu o 1. Při podtečení dojde k vyjímce EUBNumUnderFlow.

Add(A) - Přičte A.

Sub(A) - Odečte A. Pokud je výsledek záporný dojde k vyjímce EUBNumUnderFlow.

Multiply(A) - Vynásobí se A.

Power(A) - Umocní se na A.

DivRest(A, B) - Vydělí se A a vrátí se B jako zbytek při dělení. Při dělení 0 dojde k vyjímce EUBNumEDivByZero.

Divide(A) - Vydělí se A. Při dělení 0 dojde k vyjímce EUBNumEDivByZero.

Modulate(A) - Provede modulo A. Při modulo 0 dojde k vyjímce EUBNumEDivByZero.

Sqrt - Provede celočíselné odmocnění.

ShiftLeft(A) - Posune doleva o A bitů.

ShiftRight(A) - Posune doprava o A bitů.

DoOr(A) - Provede logický součet s A.

DoAnd(A) - Provede logický součin s A.

DoXor(A) - Provede logický exkluzivní součin s A.

DoNot(A) - Neguje A bitů.

IsZero - Vrátí logickou pravdu, pokud je hodnota 0.

IsEqual(A) - Vrátí logickou pravdu, pokud je hodnota rovna A.

IsGreater(A) - Vrátí logickou pravdu, pokud je hodnota větší než A.

IsShort - Vrátí logickou pravdu, pokud je hodnota menší než High(UBBase).

LoadFromStream - Načte hodnotu z datového proudu.

SaveToStream - Uloží hodnotu do datového proudu.

GetString - Vrátí hodnotu čísla převedenou na řetězec.

SetString(A) - Získá z řetězce hodnotu. V případě chyby při převodu dojde k vyjímce EUBConvertError.

GetHexString - Vrátí hodnotu v řetězci v hexadecimálním tvaru.

SetHexString(A) - Získá z řetězce hodnotu. V případě chyby při převodu dojde k vyjímce EUBConvertError.

GetShort - Přečti hodnotu do základního typu jazyka. Pokud je hodnota příliš velká dojde k vyjímce EUBNumOverFlow.

SetShort(A) - Nastav hodnotu ze základního typu jazyka.

SetValue(A) - Získá hodnotu z hodnoty objektu A.

GetValue(A) - Do objektu A nastaví stejnou hodnotu.

### 2.3. Třída UBInteger

Tato třída implementuje neomezeně velké celé číslo. Obsahuje všechny výše uvedené metody třídy UBNatural a navíc tyto další:

IsNeg - Vrátí logickou pravdu, pokud je číslo záporné.

Abs - Převede hodnotu na absolutní (vynuluje znaménko).

Neg - Převede hodnotu na opačnou (zneguje znaménko).

V třídě jsou dostupné proměnné Value typu UBNatural a Sign> typu logická hodnota, pomocí nichž je třída UBInteger implementována.

### 2.4. Třída UBReal

Tato třída implementuje neomezeně velké reálné číslo s konečným desetinným/dvojkovým rozvojem. Číslo je reprezentováno dvěma hodnotami UBInteger pojmenovanými Base a Mantis. Třída obsahuje všechny výše uvedené metody třídy UBInteger a navíc tyto další:

Trunc - Vynuluje část za desetinnou tečkou.

Frac - Vynuluje část před desetinnou tečkou.

Sin - Trigonometrická funkce Sinus.

Cos - Trigonometrická funkce Cosinus.

Tan - Trigonometrická funkce Tangens.

### 2.5. Třída UBRatio

Tato třída implementuje neomezeně přesnou hodnotu s konečným dvojkovým rozvojem v pevném intervalu <0,1>. Na rozdíl od UBReal tak ke kódování této hodnoty stačí jedna hodnota typu UBNatural.

### 3. Demonstrační programy

Demonstrační programy umožňují vyzkoušení knihovny a testování jednotlivých funkcí.

### 3.1. Demo program

Tento demonstrační program umožňuje testování metod jednotlivých tříd. Obsahuje záložky pro všechny testované třídy, přičemž v každé záložce jsou dvě vstupní a jedna výstupní oblast, ve které je možné zadávat/číst hodnoty v dekadickém a hexadecimálním tvaru. Kromě toho obsahuje oblast tlačítek provádějících jednotlivé operace. Vstupy těchto funkcí jsou brány z dekadického tvaru, proto je nutné před každým voláním provést převod.

Vzhled aplikace

### 3.2. Jednoduchá kalkulačka

Dalším ukázkovým programem je jednoduchá kalkulačka počítající v číselném formátu XBReal.

Homepage: http://xbup.sf.net
License: GNU Free Documentation License (FDL)
Latest update: 2007-01-15