ГОСТ Р 54713—2011
Предсказанное значение хеиокругляется до 16-разрядного представления с плавающей запятой
(т. е. к 7-разрядной мантиссе)до возможности использования в любом вычислении. Точный алгоритм округ
ления показан в псевдо С-функции flt_round_inf(). Следует учесть, что из соображений сложности
реализа ции вместо округления к ближайшему значению используется округление в сторону
бесконечности.
Выражения (blVARJ и (b/VAR2) округляются до 16-разрядного представления с плавающей запятой
(т. е. к 7-разрядной мантиссе), что позволяет вычислить эти отношения по двум небольшим таблицам.
С-коддля генерации таких таблиц показан в псевдо С-функции m akejnvjables ().
Все промежуточные результаты в каждом вычислении с плавающей запятой в алгоритме предсказа
ния будут представлены в округленной форме с использованием фиксированной точности с плавающей
запятой.
Вычислительный модуль IEEE с плавающей запятой, используемый при выполнении всех арифмети
ческих действий в инструменте предсказания, включает следующие опции:
Округление к ближайшему значению; округление кзначению с младшим значащим битом, равным 0.
Исключение переполнения — значения, величина которых больше, чем самое большое возможное
значение, будут установлены в бесконечность.
Исключение потери значимости — постепенная потерязначимости (денормализованные числа)будет
поддерживаться; будут обнулены значения, величина которых меньше, чем самое маленькое представи
мое значение.
11.3.2.3 Быстрый алгоритм для округления
7
static void
ftt_round_inf
(float ‘pf).
{
int fig:
unsigned long tmp. tmp1. tmp2:
tmp = ’(unsigned long’) pf:
fig = tmp & (unsignedlong) 0x00008000:
tmp &= (unsigned long) OxffffOOOO:
tmp1 = tmp:
/* округление 1/2 Isb к бесконечности У
if (Пд) {
tmp &= (unsigned long) Oxff800000:
tmp | = (unsigned long) 0x00010000:
Г извлечь экспоненту и знак V
Г вставить 1 1sb7
tmp2 - tmp: I* добавить 11sb и игнорировать один 7
tmp &= (unsigned) 0xff800000: Г извлечь экспоненту и знак 7
‘pf = * (float’). &tmp1+ ’ (float’) &tmp2 - * (float’) &tmp:
/* вычесть один ’/} {
‘pf = * (float *).&tmp:}
11.3.2.4 Генерирование округленного ЬЛ/ar
static foot mnt_table [128]:
static float expjable [256]:
Г функция flt_round_even 0 работает толькодля аргументов вдиапазоне
*1.0 < *pf < 2 .0 -2 *-2 4
‘/static void flt_round_even (float ’pf).
{
int exp. a:
float tmp:
frexp ((double) ‘pf. &exp):
tmp ~ ‘p f‘ (1 «(8-exp)): = (int) tmp:
if ((tmp-a)> = 0.5) + +;
iff(tmp-a) == 0.5) a&= -2;
‘pf= (float)/(1 «(8-exp)):}
71