Консультация № 182477
12.03.2011, 07:37
0.00 руб.
12.03.2011, 10:39
0 15 1
Здравствуйте! Прошу помощи в следующем вопросе:
Выполнить процедуру выравнивания порядка чисел с плавающей запятой, находящихся в ОЗУ. Числа состоят из трех байт: первый байт- характеристика, второй- ст.байт мантиссы, третий- мл.байт мантиссы. Мантисса представлена в дополнительном коде.
Выравнивание порядка состоит в сравнении характеристик и сдвиге вправо числа с меньшим порядком. При этом должен быть скорректирован его порядок.

Используется микроконтроллер Intel 8051

Обсуждение

давно
Посетитель
7438
7205
12.03.2011, 10:03
общий
Вы используете нестандартное кодирование чисел с плавающей точкой, поэтому сначала
1) Покажите, пожалуйста, какой код соответствует числам: 1., -1. ,-4.?
2) Каков должен получиться результат выравнивания: -1. и -4, -1. и 1. ?
Об авторе:
"Если вы заметили, что вы на стороне большинства, —
это верный признак того, что пора меняться." Марк Твен
Неизвестный
12.03.2011, 10:25
общий
Забыл написать, что используется процессор Intel 8051.
давно
Посетитель
7438
7205
12.03.2011, 10:37
общий
Существенное дополнение.
Как насчет ответов на поставленные вопросы?
Об авторе:
"Если вы заметили, что вы на стороне большинства, —
это верный признак того, что пора меняться." Марк Твен
Неизвестный
12.03.2011, 14:37
общий
1) код 1.= 0001, -1.=1111, -4.=1100
Неизвестный
12.03.2011, 14:49
общий
2) в характеристике находится в старшем байте - знак (0 ="+", 1="-"), а остальные - степень числа (если 23*10^-4, то в характеристике записано 11111100, например второе число 45*10^-5, то в характеристике 11111011. После выравнивания должно получиться 23*10^-4 и 4,5*10^-4).
давно
Посетитель
7438
7205
12.03.2011, 16:01
общий
Во-первых, Вы ответили не полностью...
Я хотел увидеть все три байта, кодирующие числа.
Во-вторых, добавились дополнительные вопросы:
Ваше понимание формата вещественных чисел не соответствует общепринятому.
1) в характеристике хранится степень (смещенная на 127) не десятки, а двойки.
2) знак числа хранится в старшем бите первого байта, а не как мантисса в доп коде.
3) да и сама мантисса хранится, как нормализованная (без старшей 1) последовательность 1 и 0.
Поэтому я и прошу, если Вы точно уверены в том, что хотите получить, чтобы Вы описали очень подробно примеры
Кстати, напишите кроме того, как Вы представляете запись в кодированном виде чисел 45*10-5 и, особенно, 4.5*10-4
Об авторе:
"Если вы заметили, что вы на стороне большинства, —
это верный признак того, что пора меняться." Марк Твен
Неизвестный
13.03.2011, 17:06
общий
То, как будет представляться мантисса - не важно на данный момент. Необходимо продемонстрировать алгоритм: выравнивание порядков операндов реализуется путем сдвига мантиссы меньшего из чисел на один разряд вправо с одновременным увеличением порядка этого числа на единицу. Действия повторяются до совпадения порядков.
Вся проблема в том, что я не знаю как при сдвиге старшего байта числа перенести бит в младший. Да и со сравнением чисел в доп коде проблема.
давно
Посетитель
7438
7205
14.03.2011, 09:36
общий
о, как будет представляться мантисса - не важно на данный момент.
Еще как важно. И не только мантисса, а и знак числа и характеристика.
Прежде чем кодировать, надо знать, с чем мы работаем, и что мы хотим получить. Я на данный момент не представляю четко Ваш формат
Например, Вы говорите:
1) знак в первом бите и одновременно - мантисса в доп коде... Доп код, к Вашему сведению, уже содержит в себе информацию о знаке...
2) Вы предлагаете привести число 45*10-5 к числу 4.5*10-4, совершенно не представляя, каким образом получается позиция точки
При этом Вы говорите, что все это не важно...
В таких условиях, я могу Вам рассказать, разве только о том, "как при сдвиге старшего байта числа перенести бит в младший" и о сравнении чисел в доп коде. Без применения в данной задаче...

Об авторе:
"Если вы заметили, что вы на стороне большинства, —
это верный признак того, что пора меняться." Марк Твен
Неизвестный
15.03.2011, 16:40
общий
Вот что стало известно: в старшем бите характеристики хранится знак мантиссы.
в остальных 7 битах - порядок числа в таком виде:
max значение порядка обозначается двоичным кодом число 127,
порядок 0 - кодом числа 64
min порядок - кодом числа 0.
Неизвестный
15.03.2011, 16:41
общий
мантисса хранится в двух байтах в прямом коде
давно
Посетитель
7438
7205
15.03.2011, 16:48
общий
Вот это уже ближе к истине...
Только надо еще добавить: мантисса хранится в нормалированном виде (без старшей 1)
И получим почти стандарт чисел с плавающей точкой
Ок, сделаю, сегодня-завтра
Об авторе:
"Если вы заметили, что вы на стороне большинства, —
это верный признак того, что пора меняться." Марк Твен
Неизвестный
15.03.2011, 16:51
общий
в нормализованном виде
давно
Посетитель
7438
7205
15.03.2011, 17:00
общий
Кстати, если интересно, почему я сказал "почти стандарт чисел с плавающей точкой"?
В стандарте характеристика занимает 8 бит, начиная со следующего за старшим и захватывая старший бит второго байта. Ну и минимум 4 байта
Но это не важно. Для трех байт, для порядка достаточно 7 бит.
Об авторе:
"Если вы заметили, что вы на стороне большинства, —
это верный признак того, что пора меняться." Марк Твен
давно
Посетитель
7438
7205
16.03.2011, 23:07
общий
это ответ
Здравствуйте, Labadist!
Программа работает с двумя форматами вещественных чисел:
1) нормализованный: sppppppp hhhhhhhh nnnnnnnn, где
s - знак числа
ppppppp - характеристика числа = порядок + 64
hhhhhhhh - старший байт мантиссы
nnnnnnnn - младший байт мантиссы
В данном формате в мантиссе пишутся биты за первой значащей единицей, которая не пишется, только подразумевается
2) временный формат. Формат тот же. Отличия в "наполнении".
Знак и характеристика имеют тот же смысл, что и в нормализованном формате
А вот в мантиссе пишутся все биты, включая старшую, только подразумевавшуюся в нормализованном формате.

Программа решает поставленную задачу, преобразуя оба числа во временный формат.
Мантиссу меньшего числа сдвигает вправо на число бит, равное разности характристик.
Характеристика меньшего числа становится равной характеристике большего.

[code h=200];Выполнить процедуру выравнивания порядка чисел с плавающей запятой, находящихся в ОЗУ.
;Числа состоят из трех байт: первый байт- характеристика, второй- ст.байт мантиссы,
;третий- мл.байт мантиссы. Мантисса представлена в дополнительном коде.
;Выравнивание порядка состоит в сравнении характеристик и сдвиге вправо числа
;с меньшим порядком. При этом должен быть скорректирован его порядок.

;Адреса во внутреннем ОЗУ
;Выбраны такие, которые позполяют адресовать биты (для знака)
;первое вещественное число
Num1_0 equ 20h ;знак + характеристика
Num1_1 equ 21h ;ст б нормализованной мантиссы
Num1_2 equ 22h ;мл б нормализованной мантиссы

;второе вещественное число
Num2_0 equ 23h
Num2_1 equ 24h
Num2_2 equ 25h

;буфер для первого числа во временном вещественном формате
Num3_0 equ 26h ;знак + характеристика
Num3_1 equ 27h ;ст б мантиссы
Num3_2 equ 28h ;мл б мантиссы

;буфер для второго числа во временном вещественном формате
Num4_0 equ 29h
Num4_1 equ 2ah
Num4_2 equ 2bh

org 0
jmp start

start: ;начало программы
;занесем числа в ОЗУ
;20h-22h = 23.e-4 = 0.0000000010010110101110111 = 1.0010110101110111*2^-9
mov Num1_0, #37h ;порядок 37h-64 = -9
mov Num1_1, #2dh ;ст б мантиссы 00101101
mov Num1_2, #77h ;мл б мантиссы 01110111

;23h-25h = 45.e-5 = 0.0000000000011101011111011011 = 1.1101011111011011*2^-12
mov Num2_0, #34h ;порядок 34h-64 = -12
mov Num2_1, #0d7h ;ст б мантиссы 11010111
mov Num2_2, #0dbh ;мл б мантиссы 11011011

call adjust ;выравниваем порядок

jmp $ ;работа сделана, зацикливаемся

Adjust: ;выравниваем порядок,
; при этом формируем числа во временном
; вещественном формате по адресам
; Num3_0-Num3_2 и Num4_0-Num4_2
;определим у кого больше порядок
mov a, Num1_0 ;характеристика первого числа
clr acc.7 ;сбросим знак
mov b, Num2_0 ;характеристика второго числа
clr b.7 ;сбросим знак
clr c ;для subb
subb a, b ;a = a - b - c
jc less_1 ;если a < b, то на less_1 (первое < второго)
less_2_or_equal: ;первое >= второго
;первое (большее) просто переводим во временный формат
;второе (меньшее) сдвигаем, кроме того, вправо на разницу в порядке
mov r0, #Num1_0 ;адрес исходного большего числа
mov r1, #Num3_0 ;адрес результирующего большего временного числа
mov r2, #Num2_0 ;адрес исходного меньшего числа
mov r3, #Num4_0 ;адрес результирующего меньшего временного числа
jmp form_greater ;на формирование большего временного числа
less_1: ;первое < второго
;второе (большее) просто переводим во временный формат
;первое (меньшее) сдвигаем, кроме того, вправо на разницу в порядке
mov r0, #Num2_0 ;адрес исходного большего числа
mov r1, #Num4_0 ;адрес результирующего большего временного числа
mov r2, #Num1_0 ;адрес исходного меньшего числа
mov r3, #Num3_0 ;адрес результирующего меньшего временного числа
cpl a ;разница порядков первый - второй будет отрицательной
inc a ;возьмем модуль (neg a = (not a) + 1)
form_greater: ;начинаем формировать, начиная с большего
mov r4, a ;сохраним разность поряднов в r4

call Add_Hi_1 ;формируем число @r0 во временном формате по адресу @r1

;преобразуем меньшее число во временный формат
mov r0, 2 ;r0 = r2 0-го банка
mov r1, 3 ;r1 = r3 0-го банка
;подправим порядок
mov a, @r0 ;старый
add a, r4 ;добавим разницу
call Add_Hi_1_1 ;идем в точку сохранения п/п формирования врем формата

;сдвинем мантиссу на r4 бит вправо
cjne r4, #0, Shift ;проверим на 0 (порядки равны?)
ret ;если равны, то уже все сделано
Shift: ;цикл сдвига
dec r1 ;вернемся на первый байт мантиссы
mov a, @r1 ;читаем
clr c ;будем вдвигать 0 из С
rrc a ;сдвигаем на один бит вправо, acc.7 = С, С = acc.0
mov @r1, a ;сохраняем
inc r1 ;на второй бай мантиссы
mov a, @r1 ;читаем
rrc a ;сдвигаем на один бит вправо, acc.7 = С = мл биту ст байта
mov @r1, a ;сохраняем
djnz r4, Shift ;r4 раз

ret

;формирование из числа в нормализованном виде по адресу @r0
;числа во временном формате по адресу @r1
;формирование заключается во вставке старшего бита = 1, которая
;в нормализованном виде только подразумевается
Add_Hi_1:
mov a, @r0 ;характеристика исходного числа
Add_Hi_1_1: ;точка входа для сохранения измененной характеристики
mov @r1, a ;сохраняем
inc r0 ;на первый байт мантиссы
inc r1
setb c ;С = 1
mov a, @r0 ;первый байт мантиссы
rrc a ;"загоняем" единицу в acc.7, С = acc.0
mov @r1, a ;сохраняем
inc r0 ;на второй байт мантиссы
inc r1
mov a, @r0 ;второй байт мантиссы
rrc a ;acc.7 = мл биту ст байта
mov @r1, a ;сохраняем
ret

end
[/code]
Об авторе:
"Если вы заметили, что вы на стороне большинства, —
это верный признак того, что пора меняться." Марк Твен
Неизвестный
16.03.2011, 23:13
общий
спасибо
Форма ответа