Материал: Программные преобразования числовой информации (96

Внимание! Если размещение файла нарушает Ваши авторские права, то обязательно сообщите нам

program Prog4; Type

rCardSingl = Record Case Byte of

0:(n:cardinal);

1:(f:single);

end;

Function FixedFloat(x:cardinal;size:byte;point:byte):Single;

var b,n,bs,m1,t:cardinal; i,r:byte; p,pn:shortint; g:rCardSingl;

begin

If x=0 Then begin

Result:=0.0;

Exit;

end;

Writeln(‘size=’,size);

Writeln(‘point=’,point);

BinaryInt('x=',x,32);

n:=x;

BinaryInt('n=',n,32);

bs:=1;

For i:=0 To size-2 Do bs := bs shl 1;

b := bs shr 1; i := size-2;

While (i>0) and (n and b = 0) Do begin

b := b shr 1; i := i - 1;

end;

pn := i - point; Writeln('pn= ',pn);

m1 := (n shl (32-(pn+point))) shr 9; BinaryInt('m1=',m1,32);

p := pn - 1;

If p >= 1 Then r := (p-1) or $80

26

Else If p=0 Then r := $7F Else r:= (p-1) and $7F;

BinaryInt('r=',r,8); t := r shl 23; BinaryInt('t=',t,32); g.w := t or m1;

If (x and bs) <> 0 Then g.w := g.w or $80000000; BinaryInt('f=',g.w,32);

Result:= g.f; end;

begin

x:= $864; WriteHex('x=',x);

Writeln('f= ',FixedFloat(x,12,3):9:6); Readln ;

End.

В основной программе число с фиксированной точкой вводится в 16-м формате. Например, если число занимает 12 бит и дробная точка находится между битами 3 и 4, то число – 6,2510 кодируется как 86416. Для этого случая на мониторе появляются следующие строки:

x =

$864

size

= 12

point = 3

x =

00000000000000000000100001100100

n =

00000000000000000000100001100100

pn=

3

m1=

00000000010010000000000000000000

r =

10000001

t =

01000000100000000000000000000000

f =

01000000110010000000000000000000

f =

11000000111010000000000000000000

f =

-6.250000

Для фиксированного числа –1,2510 соответствующий код 81416 сопровождается следующей информацией на мониторе:

x = $814 size = 12

27

point = 3

x = 00000000000000000000100000010100 n = 00000000000000000000100000010100 pn= 1

m1= 00000000001000000000000000000000 r = 01111111

t = 00111111100000000000000000000000 f = 00111111101000000000000000000000 f = 10111111101000000000000000000000 f = -1.250000

Еще одно испытание необходимо провести для числа с нулевой целой частью, например – 0,2510 ≈ 80416:

x =

$804

size

= 12

point = 3

x =

00000000000000000000100000000100

n =

00000000000000000000100000000100

pn=

-1

m1=

00000000000000000000000000000000

r =

01111101

t =

00111110100000000000000000000000

f =

00111110100000000000000000000000

f =

10111110100000000000000000000000

f =

-0.250000

Впрограмме Prog4 функция FixedFloat() построена по тем же принципам, что и функция IntFloat() из программы Prog3. В функции FixedFloat() параметрами являются: исходное фиксированное число x, размер числа в битах size, положение дробной точки слева от бита c номером point.

Втеле функции FixedFloat() проводится проверка элементарной нулевой ситуации и делаются контрольные распечатки BinaryInt(,x = ,, x, 32); для визуального контроля на мониторе.

Первым шагом алгоритма является поиск знакового бита ис-

ходного числа по значению параметра size. Для этого единица

28

устанавливается в бит 0 переменной bs = 1;. Далее с помощью инструкции цикла единица сдвигается влево в знаковый бит i;

For i:=0 To size-2 Do bs := bs shl 1;

Номер старшего бита b исходного числа находится на 1 бит справа от бита знака:

b := bs shr 1;.

На втором шаге определяется истинный порядок целой части исходного числа, исходя из положения десятичной точки:

i := size-2; // номер бита While (i>0) and (n and b = 0) Do

begin

b := b shr 1; // сдвинуть 1 в соседний бит

справа

i := i - 1; end;

pn := i - point; // порядок числа

На третьем шаге формируется мантисса хранения, которая, напомним, «прячет» старшую единицу исходной мантиссы. Делается это с помощью сдвигов, сначала влево с потерей старшей единицы, а потом вправо на 9 бит на точное место мантиссы сохранения:

m1 := (n shl (32-(pn+point))) shr 9;

На четвертом шаге формируется порядок сохранения r, который сдвигается влево на точное место t своего расположения:

p = pn

- 1;

 

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

If p >= 1 Then r := (p-1) or $80

// для

чисел > 1

 

 

 

// порядок для 1

Else If p=0 Then r := $7F

Else r:=

(p-1) and $7F;

//

порядок для < 1

t := r

shl 23;

// порядок

хранения мантиссы

29

На пятом шаге оформляется положительный вариант числа в результате битовой дизъюнкции порядка и мантиссы сохранения в поле объединения результата:

g.n := t or m1;

// положительное веще-

ственное число

 

Шестой шаг учитывает знак отрицательного исходного числа. Для этого проверяется знаковый бит фиксированного числа. Если он установлен в единицу, то выходное число получает 1 в бите 31:

If (x and bs) <> 0

// отрицательное число

Then g.n := g.n or

$80000000;

// 1 в бите 31

Алгоритм преобразования закончен. Результат возвращается в виде типа single.

10.ПРЕОБРАЗОВАНИЕ ЧИСЛА ТИПА single В ЧИСЛО

СФИКСИРОВАННЫМ ВЕЩЕСТВЕННЫМ ФОРМАТОМ

Вчислах с фиксированным вещественным форматом точка между целой и дробной частями не занимает отдельного бита (рис. 7), что используется в технических системах с управляющим компьютером, который посылает числовой результат вычисления на исполнение в периферийное оборудование. Для примера допустим, что число занимает 12 бит в прямом коде. Знак числа находится в бите 11. Дробная точка задается в пределах от бита 0 до бита 11. Эта задача является «обратной» к задаче в программе

Prog4. В программе Prog5 функция FloatFixed( ) выполняет требуемые действия:

program Prog5; Type

rCardSingl = Record Case Byte of

0:(n:cardinal);

1:(f:single);

end;

Procedure HexInt (n:cardinal;var s:string);

30

Источник: https://studfile.net/preview/16723858/