§ 3.4   Операции върху двоично-десетични числа

Operations with binary-decimal numbers

 

 

      В тази книга (глава 1) беше пояснено, че десетичната бройна система не е основната бройна система, която се прилага в съвременните цифрови процесори. Въпреки това съществуват редица допълнителни мотиви и изисквания, които задължават производителите да вложат под една или друга форма изпълними операции върху двоично-десетични числа, в пряко съответствие с основната бройна система, широко използвана от човека. Възможността за изпълнение на основните аритметични действия върху такива числа се осигурява главно от възможността да се изпълни 2/10-ично събиране (изваждане). Изпълнението на тези операции най-често се реализира в устройствата за работа с фиксирана запетая и то само за основния формат на разрядната мрежа, или поне във формат 1 байт (имайки предвид дължината на кодовата комбинация за представяне на десетичните цифри). В тези устройства, имащи сравнително проста логическа структура, и за които основният критерий е високата скорост, 2/10-ят суматор е непозволен разкош. Ето защо двоично-десетичното събиране обикновено се имитира чрез последователност от две изпълними операции - двоично събиране и двоично-десетична корекция. Втората операция е твърде специфична, специално разработена и ние ще я разгледаме по-късно отделно.

      Като цяло десетичната аритметика в процесорите с фиксирана запетая се реализира най-често по чисто програмен път, като надстройка на физическото аритметично-логическо устройство. В по-сложни или специализирани логически структури, с цел повишаване на бързодействието, алгоритмите на тази аритметика могат да бъдат реализирани апаратно. В съвременните микропроцесори с общо предназначение, 2/10-те операции са заложени косвено в аритметичните процесори за работа с плаваща запетая и чрез операциите за преобразуване на бройната система. Тъй като за нас тук е важно да представим пълно и комплексно темата, ще изложим както алгоритмите, така и техни примерни апаратни реализации. Ще разгледаме и най-новите виждания по този въпрос на водещите производители.

      За целите на обработката, 2/10-те числа най-често се представят в прав код, в така наречения пакетиран формат (пункт 1.1.6.3). Главните въпроси относно представянето на числата и оперирането с тях в този вид, вече бяха изложени тук в глава 1. Изпълнението на операциите изваждане и деление изискват обаче прилагане на обратен или допълнителен код. Инверсните машинни кодове (обратен и допълнителен) също бяха вече представени. Тук в следващите раздели ще бъдат представени някои от известните алгоритми за реализиране на операциите върху двоично-десетични числа, т.е. така наречената “2/10-чна аритметика”, както и възможностите да бъдат синтезирани логически структури за тяхната апаратна реализация. Естествено всичко е илюстрирано и с множество числени примери, които читателят ще намери в книга [2].

Използването на двоична аритметика води до минимизиране на хардуера в компютърните системи. Това се случва в алгоритмично, структурно и технологично отношение и се дължи на свойството дуалност, обвързващо Булевата логика с двоичната бройна система. Това свойство е в основата на синтеза на логическите функции за двоично събиране и за реализация на двоичните суматори, представени достатъчно изчерпателно в книга [2]. Различията между представяните данни и хардуера се контролира и компенсира с помощта на софтуер. Софтуерната поддръжка на десетична аритметика, както и софтуерно изпълняваните преобразования между двоична и десетична бройна система с цел визуализация, са с висока честота, което води до огромни загуби на време и до снижаване на производителността. Днес компютърните системи включват в минимална степен десетичен хардуер. Търговската, финансовата, комуникационната, застрахователната и научната дейности обаче, които се основават на десетични данни, се нуждаят от бърз напредък в технологията, подкрепяща десетичната аритметика в компютърната техника. Вече са натрупани наблюдения, които показват, че много приложения извършват десетична обработка от 50% до 90% от времето. Необходимостта от десетична аритметика в хардуера се оказва крайно необходима и спешна. Ето защо тя се подкрепя от стандарта IEEE 754/2008. В публичното пространство читателят може да открие множество публикации, потвърждаващи тази тенденция, подобни на тези, които му предоставяме по-долу:

http://www.tyanev.com/resources/docs/Chapter-34_Document1_OK.pdf

http://www.tyanev.com/resources/docs/Chapter-34_Document2_OK.pdf

Компанията IBM проектира и още през 2007 година включва в процесора си Z9 устройство за работа с десетична плаваща запетая (DFP). Десетичната аритметика е още по-застъпена в следващата генерация Z10 както за числа с фиксирана, така и за числа с плаваща запетая. Процесори IBM Power6, 7 също съдържат DFP устройства. Операционната система на IBM Z/OS, компилаторите за Java, C/C++ както и СУБД DB2 на компания IBM поддържат този десетичен хардуер. Може да се каже, че и други компании полагат усилия в това напраление.

Десетичните аритметични устройства по своята същност са по-сложни от двоичните, тъй като те трябва да се справят с повече различни цифри. Не трябва да се забравят и 6-те излишни кодови комбинации, които създават затруднения в синтеза на хардуера.

Основен недостатък на двоичната аритметика са неточните решения при използване на десетичните фракции на числата, т.е. на дробните части на числата. Източниците за тези неточности при използване на двоичното представяне на числата във формата с плаваща запетая са много и ние ги пояснихме подробно тук в предходните раздели. Този недостатък е отлично илюстриран с множество публикации, които читателят може да открие в публичното пространство, в които са описани ефектите в най-разнообразни практически приложения, показани в числени примери. Специален анализ на проблема читателят може да намери в статията на David H. Bailey тук:

    http://tyanev.com/resources/docs/Bailey, D.H.,  High-Precision Arithmetic: Progress and Challenges.pdf

или тук:

    http://www.davidhbailey.com/dhbpapers/hp-arith.pdf

Кодирането на десетични цифри е ключов въпрос за осигуряване на бърза десетична аритметика. Последните разработки предполага използването на алтернативни BCD кодове, като например на BCD-5211, чрез който при събиране се постига пълна аналогия с десетичния пренос. Имаме предвид основния код, чрез който е стандартизирано представянето на десетичните цифри – кодът на прякото заместване “8421”. Тук имаме възможност да илюстрираме доста подробно свойствата на този код, като споделим нашия опит чрез публикацията:

http://tyanev.com/resources/docs/BCD_Adder_in_a_weight_code-5211.pdf

Изборът на код за представяне на операнди е пряко свързан със стойността на грешката при конкретното форматиране на фракцията. Кодът BCD-5211 предоставя определено предимство по отношение на код BCD-4221 или на код BCD-8421.

Кодът 5211 е тегловно значим и е един от 17-те 4-битови BCD-кода с положителни тегла. В публичното пространство могат да бъдат намерени редица научни публикации и дори дисертации посветени на този код, в които той код се определя като перспективен за реализация на десетична аритметика, особено за операции умножение и деление.

 

 

Следващият раздел е:

3.4.1   Операция събиране и операция изваждане   ( Operation addition and subtraction )