This document in CP1251 code page.

 

Technical support e-mail : mktmk<at>narod.ru.

Home page                : mktmk.narod.ru.

 

Multiprecision unsigned number template library (MUNTL)

Distributed under the GNU LGPL.

 

Библиотека шаблонов целых беззнаковых чисел для организации

вычислений с повышенной точностью.

 

Описание применения.

 

1. Назначение программы.

 

Программа предназначена для организации вычислений с повышенной точностью для

целых беззнаковых чисел.

 

2. Условия применения.

 

Программа написана "чистом" на С++ с широким применением шаблонов.

Программа не использует ассемблер.

Программа тестировалась на BCB60 в режиме ANSI-совместимости.

Конфигурация тестового оборудования: Athlon 1800, Chaintech 7AJA2, 256Mb RAM.

Время выполнения теста (файл dit.cpp) - 42 сек.

 

3. Описание задачи.

 

Иногда необходимо иметь беззнаковые числа, разрядность которых превышает

возможности конкретной платформы. Например:

 

 - хранение больших чисел (например факториалы) и операции с ними.

 - эмуляция регистров большой длины.

 - индикация большого количества ошибок в позиционном коде.

 

Для решения этих задач предназначена эта программа.

 

4. Входные и выходные данные.

 

4.1 Общие положения.

 

Числа повышенной точности реализованы в виде шаблонного класса di_unsigned.

Этот шаблон имеет перегруженные арифметические операции. Благодаря этому,

с числами di_unsigned можно производить действия как с обычными

беззнаковыми числами.

 

Разрядность чисел di_unsigned не ограничена.

 

Внутри класса di_unsigned информация хранится в виде массива беззнаковых чисел.

 

4.2 Состав проекта.

 

Файл  di.h            - библиотека шаблонов.

Файлы dit.cpp, dit.h  - тест библиотеки шаблонов.

Файл  die.cpp         - пример использования библиотеки шаблонов.

Файл  readrus.txt     - это описание на русском языке.

Файл  readeng.txt     - это описание на английском языке.

 

4.3 Требования к параметрам шаблона.

 

Здесь и далее все конкретные цифры разрядностей относятся к платформе win32.

 

Шаблон di_unsigned имеет 3 параметра.

 

template<class T,class Tunit,T size> class di_unsigned;

 

Первый параметр (T)    - тип счетчика бит.

Второй параметр (Tunit)- тип, в котором хранится информация.

Третий параметр (size) - числовой. Определяет разрядность di_unsigned в битах.

 

Тип T должен вмещать число size. Если в качестве T применено unsigned char,

то size не может быть больше 255.

 

Тип Tunit должен быть беззнаковым для корректной работы сдвигов вправо.

 

Рекомендуется для увеличения быстродействия выбирать Tunit равным

машинному слову для данной платформы. Для win32 рекомендуется в качестве Tunit

использовать unsigned int.

 

unsigned char и char должны быть одного размера для корректной работы

функции преобразования в строку printtostring.

 

unsigned char и char должны занимать четное число бит. Возможны проблемы при

работе на платформах, имеющих CHAR_BIT=7.

 

Возможно использование чисел с разным параметром size в одном арифметическом

выражении (см пример в файле die.cpp).

 

В данной версии не поддерживается использование чисел с разными типами T

или Tunit в одном арифметическом выражении.

 

Тип T должен вмещать size+size1 для корректной работы операции умножения.

 

Тип T должен вмещать size+1 и size1+1 для корректной работы операции деления.

 

4.4 Описание примера.

 

//включение библиотеки шаблонов di_unsigned

#include <di.h>

//включение библиотеки стандартного ввода-вывода

#include <stdio.h>

 

//разрядность первого типа

const unsigned int numberbit1=250;

 

//разрядность второго типа

const unsigned int numberbit2=253;

 

//объявление первого типа

typedef di_unsigned<unsigned int,unsigned int,numberbit1> big_digit1;

 

//объявление второго типа

typedef di_unsigned<unsigned int,unsigned int,numberbit2> big_digit2;

 

//в качестве T и Tunit используется unsigned int

 

int main(int argc, char* argv[]){

 

//длина текстового массива для печати первого числа

const unsigned int l1=((numberbit1)/CHAR_BIT+1)*2+1;

 

//длина текстового массива для печати второго числа

const unsigned int l2=((numberbit2)/CHAR_BIT+1)*2+1;

 

//текстовый массив для печати первого числа

char string1[l1];

 

//текстовый массив для печати второго числа

char string2[l2];

 

//объявления и инициализация трех чисел

big_digit1 d1=1;

big_digit2 d2=1;

big_digit2 d3;

 

//применение оператора сдвига

d1<<=(numberbit1/2+1);

d2<<= numberbit1/2;

 

//применение оператора инкремента

++d1;

 

//печать результата

d1.printtostring(string1,l2);

d2.printtostring(string2,l2);

 

printf("\nd1=   0x%s",string1);

printf("\nd2=   0x%s",string2);

 

//применение оператора сложения

d3=d1+d2;

 

//печать результата

d3.printtostring(string2,l2);

printf("\nd1+d2=0x%s",string2);

 

//применение оператора умножения

d3=d1*d2;

 

//печать результата

d3.printtostring(string2,l2);

printf("\nd1*d2=0x%s",string2);

 

//применение оператора деления

d3=d1/d2;

 

//печать результата

d3.printtostring(string2,l2);

printf("\nd1/d2=0x%s",string2);

 

//применение оператора нахождения остатка

d3=d1%d2;

 

//печать результата

d3.printtostring(string2,l2);

printf("\nd1%sd2=0x%s","%",string2);

 

return 0;

}

 

4.5 Описание функций-членов.

 

Для шаблона di_unsigned определены следующие операторы:

 

&   - поразрядное "И"

|   - поразрядное "ИЛИ"

&=  - поразрядное "И"   с присвоением

|=  - поразрядное "ИЛИ" с присвоением

~   - поразрядная инверсия бит

^   - поразрядное "исключающее ИЛИ"

^=  - поразрядное "исключающее ИЛИ" с присвоением

 

=   - присвоение

 

==  - проверка на равенство

!=  - проверка на неравенство

<   - проверка на "меньше"

>   - проверка на "больше"

<=  - проверка на "меньше или равно"

>=  - проверка на "больше или равно"

 

<<  - сдвиг влево

<<= - сдвиг влево с присвоением

>>  - сдвиг вправо

>>= - сдвиг вправо с присвоением

 

+   - сложение

+=  - сложение с присвоением

-   - вычитание

-=  - вычитание с присвоением

++  - постинкремент и преинкремент

--  - постдекремент и предекремент

 

*   - умножение

*=  - умножение с присвоением

/   - деление

/=  - деление с присвоением

%   - оператор нахождения остатка

%=  - оператор нахождения остатка с присвоением

 

Дополнительно определены функции:

 

void clear(); - заполнение числа нулями

void set();   - заполнение числа единицами

 

void clear(const T bit); - очистка бита с указанным номером

void set(const T bit);   - установка бита с указанным номером

 

bool tst(const T bit) const;  - проверка бита с указанным номером. Возвращает

                                true, если бит равен единице и false в

                                противном случае.

 

const T getbite() const;  - возвращает разрядность числа

                            (количество бит в числе)

 

bool getcf() const;       - возвращает состояние переноса.

                            Устанавливается после операций сложения и

                            вычитания.

 

di_version ver() const;          - возвращает номер версии библиотеки

di_serialnumber sernum() const;  - возвращает серийный номер библиотеки

 

operator const Tunit*() const;  - приведение к указателю типа Tunit.

 

void printtostring(char* c_str,T lengthstr); - печатает в строку c_str число

                                               в hex формате.

 

di_unsigned(); - конструктор без параметров. При его применении внутренний

                 буфер не очищается и содержит мусор.

 

di_unsigned(const di_unsigned& d); - конструктор

 

template <T size1>

di_unsigned(const di_unsigned<T,Tunit,size1>& d); - конструктор

 

template<class Tv>

di_unsigned(const Tv& val); - конструктор. Tv должен быть беззнаковым целым.

                              Например unsigned int, unsigned long int.

 

di_unsigned(const char* c_str); - конструктор. Строка c_str должна содержать

                                  hex представление числа и заканчиваться

                                  нулем. При преобразовании любой недопустимый

                                  символ заканчивает преобразование.

 

Операторы присвоения. Параметры - как в соответствующих конструкторах.

 

di_unsigned& operator = (const di_unsigned& d);

 

template <T size1>

di_unsigned& operator = (const di_unsigned<T,Tunit,size1>& d);

 

template<class Tv>

di_unsigned& operator = (const Tv& val);

 

di_unsigned& operator = (const char* c_str);

 

4.6 Замечания по применению функций-членов.

 

Бинарный оператор сложения "+" возвращает число с бОльшей длиной из двух,

участвующих в операции. Например, при сложении чисел из 100 и 200 бит этот

оператор возвратит результат длиной 200 бит.

 

Бинарный оператор умножения "*" возвращает число с длиной, равной сумме длин

чисел, участвующих в операции. Например, при умножении чисел из 100 и 200 бит

этот оператор возвратит результат длиной 300 бит.

 

Бинарный оператор деления "/" возвращает число с длиной, равной длине делимого.

 

Бинарный оператор нахождения остатка "%" возвращает число с длиной,

равной длине делителя.

 

Если определить макрос DI_EXCEPTIONENABLE, при попытке деления на ноль

библиотека вырабатывает исключение типа di_exception.

 

class di_exception{

public:

di_exception(){}

};

 

По умолчанию макрос DI_EXCEPTIONENABLE не определен.

 

Никакие операторы и функции не имеют проверки на допустимость параметров.

Например, если применить функцию set(200) к числу длиной 100 бит, произойдет

аварийное затирание программы с непредсказуемыми последствиями.

 

Сайт создан в системе uCoz