Този
раздел е нов.
Създаден е
през 2021 година.
3.4.5 Смесена десетично-двоична
форма на
числата
с
плаваща
запетая - (СДДФ) , (С10/2Ф)
Decimal-Binary floating
point form of
numbers (DBFPF)
Двоични
изчисления
за десетична
аритметика
Удобната
и
най-използвана
система за
изчисления е
десетичната.
В редица
ситуации
обаче възниква
въпросът за
точността на
получаваните
резултати. И
тъй като в
съвременни
условия
изчисленията
са предимно
машинни, а машините,
които ги
изпълняват,
използват
двоична бройна
система, то
възниква
въпросът за
точността на
десетичните
резултати,
получавани
чрез
средствата
на двоичната
аритметика.
По-долу ще
поясним
ползата от
обработка на
реални
десетични
числа,
представени във
форма с
плаваща
запетая,
постигащи
точността на
ръчното
изчисление.
Тази
обработка се
основава на
алгоритми, в
които се
използва двоична
аритметика,
регламентирана
от стандарта IEEE-754.
И
така, освен
десетичната,
съществуват
различни q-ични
бройни
системи, за
които ние
подробно писахме
в глава 1 на
тази книга,
така също в
много други
нейни раздели.
За
представяне
на числата са
изобретени
две системи –
естествена и
мултипликативна,
които ние
също
подробно сме
пояснили. Ще
припомним
само, че за
мащабирането
на числата,
което се
налага като
по-удобно за
някои много
малки или
много големи
числа, се
прилага
преди всичко
мултипликативната
форма, която
още се нарича
форма с
плаваща
запетая (ФПЗ).
В случаите,
когато
порядъкът на
числото е
нула, то
най-удобно се
представя в
естествен
вид, който
наричаме
форма с
фиксирана
запетая (ФФЗ).
Ние се
задължаваме
да
представяме
числата с
максимална
точност,
особено
когато става
дума за
числата
плаваща
запетая. Това
се изразява в
понятието
нормализирана
мантиса. За
съжаление
точността за
представяне
на числата в
технически
формат
зависи
изключително
от дължината
на полето, в
което се
записва
значещата
част на
числото.
Техническият
формат обаче
във всички
случаи има
ограничена
дължината,
което е
основният
източник за
загуба на
част от
значещата
част на
числото, с
други думи на
точността за
представянето
му.
По
своята
физическа
природа
числата се представят
с
приближение.
Това се дължи
на несъвършенството
на
създадените
от човека измервателни
инструменти.
По тази
причина
говорим за
изчисления и
резултати,
които следва
да удовлетворяват
зададената
от
потребителя
точност. За
точността на
резултата
или още за
грешките, с
които той се
получава,
читателят
следва да се
обърне още
към
изложеното в
раздел 3.3.4 на
тази книга.
Тъй
като
десетичната
и двоичната
бройни системи
са несъизмерими,
то при
преобразуване
на реалните
десетични
числа в
двоични
обикновено се
получава
приблизителен
еквивалент,
който
възпроизведен
обратно не
съвпада с изходното
число. Това е
свързано с
правилото за
закръгляне –
еквивалентната
стойност може
да е по-малка
или по-голяма
спрямо
изходното
число.
Единственият
начин да се
намалят тези
грешки е
удължаване
на
разрядната
мрежа.
Числата,
получени с
приближение
могат да съдържат
верни,
съмнителни и
неверни
цифри. Неверните
цифри влияят
на точността
на изчисленията
и не рядко
водят към
съвършено
неправилни
резултати.
Неверните
цифри се стараем
да избегнем
чрез някоя от
четирите схеми
за
закръгляне.
Простото
отхвърляне
на излишните
двоични
цифри в
двоичното
число с цел
закръгляне
на
десетичния
еквивалент
до желания
брой
десетични
цифри,
най-вероятно
ще породи
неверни
цифри в
последния.
Всяко
реално число,
представляващо
правилна
дроб, може да
бъде
представено
във ФПЗ, в
която
мантисата е
цяло число.
Ако
числото е
представено
във ФПЗ с
целочислена
мантиса, то мантисата
и порядъкът
на това число
могат да се
преобразуват
в двоична
бройна
система
точно.
Смесена
десетично-двоична
форма на
числата
Въвеждаме
нова форма за
представяне
на числата
(СДДФ), както е
обявено в
заглавието. В
този формат
мантисата на
десетичното
число с
плаваща
запетая е
представена
с точност от m на
брой
десетични
цифри. При
това се
приема, че
мантисата е
цяло ляво
подравнено
число със
знак.
Порядъкът е
също цяло
число със знак.
Числа,
записани по
тези правила
ще се наричат
нормализирани
и
съответстват
на формулата
където
s означава
знак. И в
двата случая
знакът е кодиран
с двоични
цифри както
обикновено:
Следва
да помним, че
основата на
числата в този
формат е
числото q=10.
Мантисата
се записва в
поле с
дължина m разряда,
а порядъкът p в
поле с
дължина k разряда.
Такова
изображение
на десетичното
число се
нарича нормализирано.
Например, при
m=7 и k=4,
последователността
0
1234560 1 0004
ще
се чете като
десетично
число в
мултипликативен
вид
съответно
+1234560.10-4 ,
чиито
естествен
вид е числото +123,4560.
Минималната
стойност на
нормализираната
десетична
мантиса в
горната
примерна структура
е цялото
число 1000000, а
максималната
е цялото
число 9999999.
Предложената
форма се
нарича
смесена,
защото
мантисата и
порядъкът не могат
да се
представят
машинно
непосредствено,
а се
представят
чрез своите
двоични еквиваленти.
В
смесената
десетично-двоична
форма (СДДФ) десетичните
числа се
представят
според следната
структура
,
в
която
мантисата М и
порядъкът р
имат свои
собствени
знаци s.
В тази
структура
мантисата М е
представена
в поле с
дължина i бита,
като ляво подравнено цяло двоично
число със
знак, а
порядъкът в
поле с дължина
j бита,
като цяло
двоично
число със
знак. Така (i+j)=n е
общата
двоична
дължина на
разрядната
мрежа.
Фиг. 3.4.5.1.
Структура
на разрядна
мрежа с плаваща
запетая в
СДДФ
Ако в
една 32 битова
разрядна
мрежа (n=32=i+j,
i=25, j=7), 24
бита се
отделят за
модула на
мантисата,
един разряд
за знака на
числото, още
един за знака
на порядъка,
и тогава
останалите 6
бита могат да
съдържат
модула на
порядъка.
Максималната
стойност от
шест двоични
единици в полето
на порядъка
съответстват
на десетичната
стойност 63.
Така модулът
на представяните
в тази
примерна
СДДФ
десетични
числа ще се
намира в
интервала
т.е.
В
същото време
припомняме,
че формулата
за двоичния
вид на
числото в
стандарта IEEE-754 във форма
с плаваща
запетая има
вида
Така
за двоичния
еквивалент
на максималната
мантиса 9999999 е
необходимо
поле с
дължина i=24[b]:
99999999(10) = 100110001001011001111111(2) .
Изчисления
в смесена
десетично-двоична
форма на числата
Аритметичните
операции
между
десетичните
числа с
плаваща
запетая се
изпълняват обикновено,
в които
всички
аргументи са
цели числа.
Резултатът
от всяка
аритметична
операция
следва да
бъде
нормализирана
според указаното
по-горе
правило и
закръглена
до
най-близката
цяла
стойност. Тъй
като порядъкът
съответства
на
десетичната
основа на
бройната
система,
нормализацията
на резултата
изисква той
да бъде
умножен или
разделен на 10
(1010). Броят на
десетичните
цифри в нормализираната
двоична
мантиса
трябва да
бъдат не
повече от m.
Ще
илюстрираме
аритметичните
операции между
числа,
представени
в тази форма
със следния
пример:
да се
изчисли
резултатът
от израза с
точност до m=7
цифри:
Ръчното
изчисление,
както и това
с калкулатора
на Windows, довежда
до
стойността 8,000000 .
И така,
нека запишем
операндите с
нормализирана
мантиса:
Във
въведената
за
представяне
структура, тези
десетични
операнди ще
бъдат се
записват
така:
A = [ 0, 9675423, 1, 1 ] = [
0, 100100111010001010011111, 1, 000001 ] ;
B = [ 0, 9675421, 1, 1 ]
= [ 0, 100100111010001010011101,
1, 000001 ] ;
C = [ 0, 1000000, 0, 0 ] = [
0, 000011110100001001000000, 0, 000000 ] ;
D = [ 0, 1999920, 1, 1 ] = [
0, 000111101000010000110000, 1, 000001 ] .
Намираме
разликата от
мантисите MS=MA-MB. Тъй като
порядъците
на числата са
еднакви (-1),
изпълняваме
изваждането
MS = 9675423 – 9675421 = 2
;
В
новата форма
резултатът
за S
следва да
бъде записан
така
S = [ 0, 2000000,
1, 7 ] = [ 0, 000111101000010010000000, 1, 000111 ] .
Ще
изчислим
произведението
P=S.C. Според
математическите
правила
трябва да
умножим
мантисите и
да съберем
порядъците
на двата
операнда.
Полученото
произведение
следва да
нормализираме:
P = [ 0, 2000000,
1, 1 ] = [ 0, 000111101000010010000000,
1, 000001 ] .
Последното
действие е
изваждане R=P-D.
За
сравнение,
изчисляваме
стойността
на същия
израз с
помощта на Excel. Получаваме
следния
резултат:
Фиг. 3.4.5.2.
Резултат от
изчисление
на примерния
израз в Excel
Както
може да се
види,
резултатът
не е точен и
не съвпада с
изчисления
ръчно. Подобна
неточност в
резултата се
получава от всяко
приложение,
създадено с
известните програмни
средства, в
които се
използва двоично
представяне
на
операндите в
израза според
стандарта IEEE 754. Причините
за това бяха
подробно
изложени в
преходния
раздел 3.3.4 на
тази книга.
За грешките
от двоичните
изчисления
се говори и
много други
раздели, когато
е имало
повод, с
което сме
искали
непрекъснато
да държим
потребителя
(програмиста)
свързан с
особеностите
на
хардуерния изчислител.
С
представената
СДДФ искаме
да дадем на
читателя и
друга гледна
точка към
проблемите
на точните
изчисления,
за да може
той да вземе
най-правилния
избор.
По-долу
ще
представим
машинното
изчисление
на
разглеждания
пример в
двоичната
аритметика на
стандарта IEEE 754.
Най-напред ще
представим
операция
изваждане.
Операция
изваждане
Както
и в ръчното
изчисление,
започваме с изваждане
на
нормализираните
десетични мантиси
MS = MA-MB = 9675423 – 9675421 = 2 .
Действителното
изображение
на десетичните
мантиси
представлява
техният
двоичен еквивалент
MA(2) = 100100111010001010011111 ;
MB(2) = 100100111010001010011101 ,
който
както се
вижда заема
напълно
24-битовото
поле на
двоичната
мантиса
според фигура
3.4.5.1.
Добре
е известно,
че операция
изваждане се
извършва с
помощта на
допълнителен
код, така че
числата
първоначално
представяме
в прав код:
Изваждането
изглежда
както е
показано тук
Следва
да
нормализираме
получената
мантиса и да
определим
новата стойност
на порядъка
на разликата
според СДДФ.
За целта
трябва да
получим
2/10-чния вид на мантисата. Последната
е 7 разрядна.
Тъй като
двоичната
стойност е
само от два бита,
то
алгоритъмът
за
преобразуване
има елементарно
изпълнение и
ние няма да
го привеждаме.
Получава се
следния
резултат
MA(10) = 0000
0000 0000 0000
0000 0000 0010 ;
Ще
припомним, че
споменатият
алгоритъм е изложен
раздел 3.6 на
тази книга
а
числени
примери,
които го
илюстрират,
могат да
бъдат
разгледани в
книга [2],
раздел
8.4.1.
Нормализацията
на
десетичната
мантисата
представлява
изместване
наляво на 6
разряда
MA(10) = 0010 0000
0000 0000 0000
0000 0000 = 2000000
;
В
резултат на
изместването
се коригира и
порядъкът, който
става (-7). Така
окончателно
десетичната разлика
има вида
В СДДФ
това число ще
се запише
така
S = [ 0, 2000000,
1, 7 ] = [ 0, 000111101000010010000000,
1, 000111 ] .
Операция
умножение
Следва да
изчислим
произведението
P=S.C.
.
Мантисите
са цели
двоични
положителни
числа и се
умножават в
прав код.
Десетично
нормализиране
на
получената мантиса
Ще
запишем
нормализираното
произведение
така:
След
събиране на
порядъците
на съмножителите,
окончателният
вид на
произведението
е:
Операция
изваждане
Последното
действие е
изваждане R=P-D , което
по-горе беше
записано
така:
Както
и в ръчното
изчисление,
започваме с операция
изваждане на
нормализираните
десетични
мантиси, като
преди това
сме отчели,
че
порядъците
на двата
операнда P и
D са
еднакви.
MR = MP-MD = 2000000 – 1999920 = 80 .
Действителното
изображение
на десетичните
мантиси
представлява
техният двоичен
еквивалент
MP(2) = 000111101000010010000000
;
MD(2) = 000111101000010000110000 ,
който
както се
вижда заема
24-битовото
поле на
двоичната
мантиса
според
фигура 3.4.5.1.
Добре
е известно,
че операция
изваждане се
извършва с
помощта на
допълнителен
код, така че
числата
първоначално
представяме
в прав код:
Изваждането
изглежда
както е
показано тук
Окончателният
резултат от изчислението
на примерния
израз се
записва така:
И
така, с
представения
числен
пример и неговото
изпълнение
според
изискванията
на СДДФ
считаме, че
представената
форма обезпечава
изискваната
точност
каквато тя е
в десетична
бройна система.
Ще завършим с
това, че СДДФ
изисква от
конструкторите
реализация
на съответния
хардуерен
изчислител.
Сравнителни
характеристики
на СДДФ на числата
Ще изброим
характеристиките
на традиционната
форма и
представената
тук, за да
може да бъдат
по-лесно
тяхното
сравнение.
Допълнителни
сведения
читателят
може да
намери тук:
https://en.wikipedia.org/wiki/Half-precision_floating-point_format
1.
Мантисата
на число,
представено
според
стандарта IEEE 754, е
двоично
число от
вида
± 1,bbb…bbb
|
Мантисата
на число,
представено
в СДДФ, е цяло
десетично число
от вида ± dxxx…xxx, където d е
десетична
цифра,
различна от
нула. Тази десетична
мантиса се
представя
от своя двоичен
еквивалент ± bbb…bbb,
|
2. В поле с
дължина 10
бита
двоичната
последователност
от 10 единици
(1111111111) е
еквивалентна
на десетичното
число 1023.
Следователно
по-големи
числа ще имат
двоична
дължина
по-голяма от 10
бита и ще
бъдат
непредставими.
Така всички
десетични
числа ≤ 999 ще
могат да се
представят
точно в това 10
битово поле.
3. В IEEE
754
максималната
нормализирана
двоична мантиса
има
десетичния
еквивалент
Mmax =
1,1111111111 = 1,9990234375 .
Гарантираният
брой верни
десетични
цифри, които
могат да се
получат след
преобразуване
на 11-битовата
двоична
мантиса е 3.
Максималната
3-цифрена
нормализирана
десетична
мантиса е
Mmax = 999,
.
Двоичният
еквивалент
на това число
е 10-битово:
Mmax = 1111100111, .
Това
означава, че
в СДДФ
3-цифрената
мантиса може
да се
представя
точно.
4.
Минималната
нормализирана
мантиса
според IEEE 754 е
Mmin = 1,0
.
|
Минималната
нормализирана
мантиса в
СДДФ е
Mmin = 100,
.
Двоичният
еквивалент
е Mmin = 0001100100,
|
5.
Максималното
десетично
число
според IEEE754 е числото
Mmax = 1,9990234375.231 =
4292870144 .
|
Максималното
десетично
число
според СДДФ
е числото
Mmax = 999.1031 .
|
6.
Минималната
стъпка
(дискретът)
според IEEE 754 е
числото
h = 0,0000000001.2-15 =
3,0517578125.10-5
|
Минималната
стъпка
(дискретът) в
СДДФ е
числото
h = 100.10-15 = 1.10-13
|
Следващият
раздел е:
§ 3.5
Логически
операции,
сравнения, измествания
(Logical operations,
comparisons, shifts)
http://www.tyanev.com/home.php?lang=bg&mid=18&mod=1&b=12&s=325