ЭУМК по дисциплине "Программирование проблемно-ориентированных вычислительных средств реального времени" › Теория › Тема 7. Программирование вычислений с плавающей запятой на процессорах с фиксированной запятой

# Электронный учебно-методический
комплекс по дисциплине
"Программирование проблемно-ориентированных вычислительных средств реального времени"

для специальности

1-40 02 02 «Электронные вычислительные средства»

Оглавление | Программа | Теория | Практика | Контроль знаний | Об авторах

7.4. Реализация операции деления чисел с ПЗ
7.4.1. Алгоритм деления чисел с плавающей запятой

Основу алгоритма операции деления составляет разложение частного от деления мантисс в ряд с определенной точностью и вычитание порядков.
Тогда алгоритм умножения чисел f1 = m1 · be1 и f2 = m2 · be2 может быть записан следующим образом:
f1 · f2 = m1 / m2 · b(e1–e2)
Для пояснения данного алгоритма представим мантиссы в следующем виде:
делимое – A = AHI + ε·ALO
делитель – B = BHI + ε·BLO
где ε = 1/2длина младшей части = 1/216
Тогда процесс деления может быть описан выражением

Обозначив первое частное через новую переменную Q, которая может быть записана как QHI+ε·QLO и учитывая что ε2 << 0, получим окончательное выражение для алгоритма деления

Схема алгоритма деления двух чисел с плавающей запятой А и В с формированием результата в С представлена ниже (рис. 7.4).

###

### Рисунок 7.4 – Алгоритм деления чисел с плавающей запятой

7.4.2. Программная реализация деления чисел с плавающей запятой

Пример программы с прямой адресацией деления двух чисел с плавающей запятой представлен ниже.

    ; ППО ЭВС РВ Лекции
    ; (c) Клюс В.Б. 22/11/04 21:00
    ; Деление с ПЗ
    	.mmregs				; Определение регистров
    	.def	_c_int00			; Метка начала программы
    	.align	80h			; Выровнять на начало страницы
    _c_int00:
    	ld	#ASIGN, DP			; Текущая страница
    	stm	#ASIGN, SP			; Указатель стека
    	st	#1, ONE
    	ssbx	SXM				; Расширение знака
    	rsbx	OVM				; Запрет коррекции переполнения
    	call	DIVFLT
    	nop
    	nop
    	nop
    	nop
    DIVFLT	stm	#ASIGN, ar2	; Адрес 1-го операнда
    ;	rpt	#7
    ;	portr	PA0, *ar2+
    UP	ld	ASIGN, a			; Определение знака
    	xor	BSIGN, a			;
    	stl	a, CSIGN
    	ld	AHI, 14, a			; Сдвиг А вправо на 1,
    	add	ALO, -1, a			; защита от переполнения
    ;	dld	AHI, a
    ;	sftl	a, -2
    ; проверка на 0
    	bcd	NEXT, aneq
    	dld	BHI, b			;1w
    	nop					;1w
    ;	rpt	#3
    ;	portw	ALO, PA0
    	ret
    NEXT	bc	STRT, bneq
    ;	rpt	#3
    ;	portw	ONE, PA0
    	ret
    STRT
    	rpt	#15				; <- & 14 if ALO(0)=0
    	subc	BHI, a
    	stl	a, CHI
    	and	#7FFFh, 16, a		; остаток
    	rpt	#15
    	subc	BHI, a
    	stl	a, CLO
    	ld	CHI, T
    	mpy	BLO, a
    	rpt	#14
    	subc	BHI, a
    	stl	a, TEMP
    	dld	CHI, a
    	subs	TEMP, a
    	sftc	a
    	bcd	NORMAL, ntc
    	dst	a, CHI			;1w
    	ld	AEXP, a			;1w

    	add	ONE, a
    NORMAL	stl	a, CEXP
    ;	rpt	#3
    ;	portw	*ar2+, PA0
    	ret
    	.align	80h			; Выровнять на начало страницы
    ASIGN	.word	0				; 1-й операнд
    AEXP	.word	0
    AHI	.word	5555h				; двойное слово
    ALO	.word	2222h				; с четного адреса
    BSIGN	.word	-1				; 2-й операнд
    BEXP	.word	0
    BHI	.word	5000h				; двойное слово
    BLO	.word	1111h				; с четного адреса
    CSIGN	.word	0				; результат
    CEXP	.word	0
    CHI	.word	0				; двойное слово
    CLO	.word	0				; с четного адреса
    TEMP	.word	0
    ONE	.word	0
    	.end					; Конец программы

Оглавление | Программа | Теория | Практика | Контроль знаний | Об авторах
© БГУИР , 2012