Този раздел е нов. Създаден е през 2021 година.

 

 

3.3.3.1.  Необходима ли е нормализация за числата с плаваща запетая?

Is normalization necessary for floating point numbers ?

 

 

      В глава 1 на тази книга, както и тук, в предидущите раздели на глава 3, ние изяснихме подробно въпросът с представянето на числата във форма с плаваща запетая според действащия стандарт IEEE-754, както и оперирането с тях. Беше изяснено понятието нормализирана мантиса, както и всички ефекти, свързани с нормализацията. Разгледани бяха също така и случаите на числа с ненормализирана мантиса. Денормализираните числа са въведени допълнително в стандарта, тъй като те са естествен продукт на изчисленията, особено когато се цели висока точност. За съжаление алгоритмите за обработка на такива числа водят до значителни апаратно-програмни разходи, които забавят компютърните изчисления десетки и даже стотици пъти. В резултат възниква въпросът – толкова ли е необходима нормализацията на числата за компютърната аритметика? На този въпрос е посветено изложеното по-долу в този раздел.

      Както е известно, всяко число, записано в естествен вид, има еквивалент в така наречения мултипликативен вид:

където с М (мантиса) е означено число с ляво фиксирана запетая в поле с дължина n бита, а с р (порядък) е означено цяло число в поле с дължина k бита. Смисълът на елементите на този вид на изобразеното число бяха изяснени изключително подробно в тази книга и са добре известни.

      Когато се създава мултипликативният вид на дадено число, според избрания формат на разрядната мрежа, единствената грижа е за това числото да бъде изобразено с минимална грешка. Това изисква в мантисата да попаднат максимум цифри от старшата част на значещата част на числото, без при това да настъпи препълване в полето на порядъка. За примерите по-долу ще приемем следните дължини n=5 и k=3.

      Нека разгледаме като пример двоичното число X=0,011 записано в естествен вид. Според горната формула, мултипликативният вид на числото е нееднозначен и може да изглежда например в следните няколко варианта:

0,011.20,  или  0,11.2-1  или  11.2-3,  или  0,0000011.24  и пр.

СЛУЧАЙ  1

      Ще вземем още едно число, например Y=0,001, което с нормализирана мантиса би имало изображението:

0,1.2-2 

      Нека сега получим сумата на числата X, Y.

X+Y = 0,011 + 0,001 = 0,100 .

      Ще изпълним същата операция в условията на формула (3.3.3.1.1).

X+Y = 0,11.2-1  +  0,1.2-2  =  0,11.2-1  +  0,01.2-1  =  1,00.2-1  =  0,100.20  .

СЛУЧАЙ  2

      Сега ще разгледаме същите числа и същите действия, не без условията за нормализирано представяне на мантисите на числата. Нека числата са изобразени така:

X = 0,00011.22  ;         Y = 0,01.2-1  .

      Приемаме, че в операция събиране встъпват така изобразените числа.

X+Y =  0,00011.22  +  0,01.2-1  =  0,00011.22  +  0,00001.22  =   0,00100.22 .

      Сравнявайки двата случая, получените като сума числа математически са еквивалентни:

0,100.20    0,00100.22  .

      И двата резултата могат да се съдържат в разрядната мрежа без да се налагат допълнителни преобразования. По този начин, нееднозначното изображение на числото в разрядната мрежа, не влияе по никакъв начин на коректността на математическите преобразования. С други думи, въпреки фиксираните дължини на полетата в разрядната мрежа, това не дава предимство на отделните видове на представените числа.

      След казаното се налага важният извод, че всяка нормализация на числото представлява операция, довеждаща до непродуктивно използване на изчислителните ресурси. Единственото за което следва да се грижим при запис на числата в разрядната мрежа, е изображенията на техните мантиси и порядъци да не излизат извън определените им полета, т.е. да няма загуба на значещи разряди. Такава процедура е предвидена във всяко изчислително устройство за работа с плаваща запетая.

      И още един важен извод може да бъде формулиран в резултат на направените разсъждения. Отказът от нормализация на мантисите на числата позволява да получим в явен вид стойността на числото нула и по естествен път да обхванем диапазона на малките числа, без изкуственото въвеждане на класа на денормализираните числа. Всичко това ще позволи съществено да се опрости процесът на запис на числото в разрядната мрежа, и като следствие, съществено да се намали времето за изпълнение на аритметическите операции.

      Въпреки че денормализираните числа позволяват да се борим с грешките и да обработваме много малки по стойност числа, за тези възможности заплащаме много скъпо. По тази причина обработката на денормализирани числа апаратно се реализира изключително рядко – вместо това се използват програмни реализации, примирявайки се с значителното забавяне на изчисленията. В следващата таблица са приведени оценките за забавянето (в пъти) на изчисленията за различни процесори (по данни на следния източник (от 2006 година):

http://charm.cs.uiuc.edu/papers/SubnormalOSIHPA06.pdf   .

 

Производител

Процесор

Забавяне (в пъти)

IBM

PowerPC 970

2,4

AMD

Athlon

6,0

Intel

Pentium 3

15,8

AMD

Athlon 64

21,4

AMD

Opteron64

23,8

Intel

Core Duo

44,2

Intel

P4 Xeon

97,9

Intel

Pentium 4

131,0

Intel

Itanium 2

183,2

Sun

UltraSPARC IV

520,0

 

      Показаните резултати са най-лошите, показани при тестване с компилаторите (gcc, icc, xlc) с използване на всички достъпни за оптимизация флагове. В статията се твърди, че различията между средния и най-лошия случаи е незначително.

      Тъй като в стандартните формати на фòрмата с плаваща запетая (единична и двойна дължина) денормализираните числа действително се получават с много малки стойности, които практически не влияят на резултатите при някои изчисления (въпреки че ги забавят значително), то най-често те се игнорират. При това се използват два прости механизма, които са получили наименованието Flush-to-zero (FTZ - Изплакване до нула) и Denormals-are-zero (DAZ - Денормалните са нула). Първият механизъм (FTZ) заставя алгоритъма на изпълняваната операция да завършва с резултат нула, веднага когато стане ясно, че резултатът ще бъде денормализирано число. Вторият механизъм (DAZ) заставя алгоритъма на изпълняваната операция да приема подаваните на вход аргументи като числото нула, когато те се оказват денормализирани числа.

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

      Във версията на стандарта IEEE 754 от 2008 година денормализираните числа са преименувани с термина subnormal numbers , което следва да разбираме като числа, които са по-малки от “нормалните” (субнормални числа).

 

 

 

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

3.3.4.  Грешки при изчисления с плаваща запетая  ( Floating point errors )