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

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

BinaryInt('f=',g.n,32); p:= g.n Shr 23; BinaryInt('p=',p,8); t:= p -127; BinaryInt('t=',t,8);

If t<0 Then begin

Result:=0;

Exit;

end;

z:=((g.n Shl 8) or $80000000) Shr (31-t);

If g.n and $80000000 <> 0 Then z:= not z + 1; BinaryInt('z=',z,32);

Result:=z;

end;

var f :single; n :integer;

begin

Write (‘f=’); Readln (x); n:=FloatInt (f); Writeln ('n= ',n); Readln;

end.

Если в качестве исходного ввести число 6,25, то на мониторе появляются следующие строки:

f = 6.25

f = 01000000110010000000000000000000 p = 10000001

t = 00000010

z = 00000000000000000000000000000110 n = 6

В этом мониторном протоколе действий переменная p содержит «смещенный» порядок хранимой мантиссы, определяемый в результате сдвига исходного бинарного числа вправо на 23 бита. Истинный порядок t получается после вычитания из значения p смещения 27-1, поэтому t имеет тип integer, пригодный для

21

положительных и отрицательных значений. Это число 00000102 = = 210 показывает положение воображаемой дробной разделительной точки, т. е. хранимая мантисса 1001 ≈ 10,01. Результат запоминается в переменной z = 1102 = 610. Эти действия последовательно запрограммированы в функции FloatInt() в программе

Prog2.

Взаимодействие с отрицательными порядками проявляется с другими числами, например 0,25. На мониторе получается следующий результат:

f = 0.25

f = 00111110100000000000000000000000 p = 01111101

t = 11111110 n = 0

Впримере с числом 0,25 порядок отрицательный: p = 01111101.

Врезультате смещения получаем t < 0, целая часть равна 0.

Алгоритм функции FloatInt() успешно работает с числом, у которого целая часть равна 1. Выполняя программу Prog2 для сходного числа, например 1,25, получаем следующие строки на мониторе:

f = 1.25

f = 00111111101000000000000000000000 p = 01111111

t = 00000000

z = 00000000000000000000000000000001 n = 1

8. МОДЕЛИРОВАНИЕ ПРЕОБРАЗОВАНИЯ integer – single

Пусть исходное число находится в четырехбайтном формате типа integer. Необходимо преобразовать это число в четырехбайтный формат типа single. Для этого потребуется смоделировать мантиссу и порядок нормализованного числа в таком виде, какой принят для хранения вещественных чисел (с учетом «спря-

22

танной» единицы мантиссы). В языке Паскаль подобное преобразование выполняется автоматически:

Var f:single; n:integer;

Begin f:=n;

end;

Однако такое решение подразумевает выполнение функции преобразования из типа integer в тип single, т. е. мы должны решить задачу, обратную задаче программы Prog2. Программа Prog3 моделирует подобное преобразование:

program Prog3;

Function IntFloat(n:integer):Single; Var

b,m,k:cardinal;

i,p:byte;

g:rCardSingl; begin

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

If n and $80000000 <> 0 Then k:= not n + 1 Else k:=n;

If k=0 Then begin

Result:=0.0;

Exit;

end; b:= $80000000; i:=31;

While k and b = 0 Do begin

i:=i-1; b:=b Shr 1;

end;

Writeln('i=',i); p:= i+127; Writeln('p=',p);

23

BinaryInt('p=',p,8); m:=k Shl (32-i) Shr 9; BinaryInt('m=',m,32); g.n:=m or (p Shl 23);

g.n:= g.n or (n and $80000000); BinaryInt('f=',g.n,32); Result:= g.f;

end; var

n:integer; begin

Write('n='); Readln(n); Writeln('f= ',IntFloat(n):8:6); Readln;

end.

Если в начале выполнения программы Prog3 ввести число n = 6, то последовательность преобразований появится на мониторе в следующем виде:

n = 6

n = 00000000000000000000000000000110 i = 2

p = 129

p = 10000001

m = 00000000010000000000000000000000 f = 01000000110000000000000000000000 f = 6.000000

Интересен результат, получающийся после ввода числа –1:

n = -1

n = 11111111111111111111111111111111 i = 0

p = 127

p = 01111111

m = 00000000000000000000000000000000 f = 10111111100000000000000000000000 f = -1.000000

24

Алгоритмы программы Prog3 и функции IntFloat( ) настолько очевидны, что их анализ предлагаем читателю провести самостоятельно.

9. ПРЕОБРАЗОВАНИЕ ЧИСЛА ИЗ ФИКСИРОВАННОГО ВЕЩЕСТВЕННОГО ФОРМАТА В ЧИСЛО ТИПА single

Задачи на преобразование форматов чисел с фиксированным разделением целой и дробной частей часто возникают при работе с информацией, поступающей от различных датчиков, тарификация которых предполагает наличие вещественных чисел с заданной точностью. Минимальная требуемая точность значащих цифр – 12-битная. В каждом конкретном приложении где-нибудь фиксируется воображаемая точка, разделяющая целую и дробную части. В качестве примера допустим, что информация располагается в битах 0 – 11. Младшие значения находятся в младших битах. Бит 11 хранит знак числа: 0 – для положительного числа и 1 – для отрицательного числа. Информация представлена в прямом коде. Чтобы не очень усложнять задачу, будем считать, что подразумеваемая разделяющая точка может находиться в любом месте между битами 0 и 10. Например, не занимающая специального бита точка предполагается между битами 3 и 4 (рис. 7).

11

 

10

9

8

7

6

5

4

 

 

3

2

1

0

 

1

 

0

0

0

0

 

1

 

1

0

 

 

0

1

 

0

0

 

 

 

 

 

 

 

 

 

Целая часть

 

 

 

 

 

Дробная

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

часть

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Разделяющая дробная точка

 

 

Знак числа

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Рис. 7. Фиксированное 12-битное расположение вещественного числа – 6,25; положение дробной точки подразумевается между битами 3 и 4; шестнадцатеричный код числа – 6,25. = $864

В программе Prog4 функция FixedFloat() осуществляет преобразование из фиксированного формата представления вещественного числа в нормализованный формат типа single:

25

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