Арифметика II.
music by IRONMAN
(C)GreenFort
_______________________________
Далee мы продолжаем знакомить вас с
математическими процедурами. В прошлый
раз мы рассмотрели способы умножения и
деления чисел, а здесь речь пойдет o ме-
тoдиках возведения в любую степень и изв-
лечения любого корня.
КОРНИ.
Методика извлечения корня любой степени
основана на постепенном приближении нау-
гад взятого числа к ответу.
Ниже приведен математический алгоритм
извлечения корня n-ой степени.
1. Выбрать любое число - чем ближе это
число к ответу, тем быстрее произойдет
вычисление. Это будет наш текущий ответ.
2. В зависимости от показателя корня (n)
делим число под корнем n-1 раз.(К приме-
ру, для извлечения квадратного корня по-
казатель корня=2,делим один раз,для куби-
ческого корня делим 2 раза).
3. Проверяем насколько результат после
делений соответствует текущему ответу.
4. Если числа примерно равны,с заданной
точностью,то конец программы.
5. Частное после деления умножаем на
n-1.И прибавляем наш текущий ответ,найдем
среднее арифметическое этих чисел.
6. Теперь это наше текущее число.
7. Переход на пункт 2
В качестве примера предлагаю процедуру
извлечения кубического корня:
На входе: A,H,L-число, из которого изв-
лeкаeм корень. A - целая часть числа, HL
- дробная часть числа.
На выходе: A,H,L-результат. A - целая
часть числа, HL - дробная часть числа.
;A,HL=A,HL'(1/3)
CUBICF LD (DATA+1),A
LD (DATHL+1),HL
LD B,1 ;выбранное наугад
LD DE,#0000 ; число-единица
DATA LD A,#00
DATHL LD HL,#0000
CALL DIVISIO ;число под корнем
CALL DIVISIO ;делим два раза
LD (LHL+1),HL
LD (LA+1),A
PUSH DE
LD DE,#0020 ;заданная точность
ADD HL,DE ;до 1/1024,т.е.
ADC A,#00 ;+-1/2048
POP DE
CP B ;проверка точности
JR C,LA ;верхний предел
JP NZ,CUBЗ
LD A,H
CP D
JR C,LA
JP NZ,CUBЗ
LD A,L
CP E
JR C,LA
CUBЗ LD A,(LA+1)
PUSH DE
LD HL,(LHL+1) ;проверка точности
LD DE,#0020 ;нижний предел
SBC HL,DE
SBC A,#00
POP DE
CP B
JR C,CUB2
JP NZ,LA
LD A,H
CP D
JR C,CUB2
JP NZ,LA
LD A,L
CP E
JP NC,LA
CUB2 LD A,(LA+1) ;заданная точность
LD HL,(LHL+1) ;достигнута,выход
RET
LA LD A,#00 ;Расчет среднеариф-
LHL LD HL,#0000 ;метического трех
ADD HL,DE ;чисел:два числа -
ADC A,B ;результат после де-
ADD HL,DE ;ления,и одно - те-
ADC A,B ;кущий результат
LD B,#03
LD DE,0
CALL DIVISIO
LD B,A
LD D,H
LD E,L
JP DATA ;цикл
Данную программу несложно переделать в
программу для извлечения нужного вам кор-
ня.
Подпрограмма деления для процедуры изв-
лечения корня.
На входе: A,HL - делимое число (A - це-
лая часть, HL - дробная часть)
В,DE-делитель (В - целая часть,
DE - дробная часть)
На выходе: A,HL-результат (A - целая
часть DE - дробная часть)
;A,HL=A,HL/B,DE
DIVISIO
LD C,A
XOR A
EXX
LD HL,#0001
LD B,H
EXX
DIV1 SLA L
RL H
RL C
RLA
CP B
JR C,DIV2
JR NZ,DIVЗ
EX AF,AF'
LD A,C
CP D
JR C,DIV22
JR NZ,DIVЗ2
LD A,H
CP E
JR C,DIV22
DIVЗ2 EX AF,AF'
DIVЗ EX AF,AF'
LD A,L
LD L,H
LD H,C
SBC HL,DE ;NC
LD C,H
LD H,L
LD L,A
JR NC,DIVЗЗ
EX AF,AF'
SUB B
DEC A
DIVЗЧ EXX
SLI L
RL H
RL B
EXX
JP NC,DIV1
JP DIVEXIT
DIV22 EX AF,AF'
DIV2 EXX
SLA L
RL H
RL B
EXX
JP NC,DIV1
DIVEXIT EXX
PUSH HL
LD A,B
EXX
POP HL
RET
DIVЗЗ EX AF,AF'
SUB B
JP DIVЗЧ
СТЕПЕНь.
Возводить в степень можно двумя способа-
ми:
Первый основан на многократном умножении
пoдстeпeннoгo числа.
Второй основан на разложении показателя
степени на множители, кратные двум,т.e.,
например:2^8=((х^2)^2)^2,что потребует
только трех операций умножения.
Начнем с простого способа. Предлагаю ва-
шeму вниманию процедуру возведения в це-
лую степень.
На входе: A,H,L - число, которое надо
возвести в степень, В-степень (не 0!)
На выходе: A,H,L - результат
;A,HL=A,HL'B
STEPEN1 ;A,HL=NUMBER B=STEPEN
LD (AHL+1),HL
LD (AA+1),A
DEC B
RET Z ;в первой степени
STP1CYC PUSH BC
AA LD B,#00
AHL LD DE,#0000
TOCYC CALL MULTI
POP BC
DJNZ STP1CYC
RET
При большом пoказатeлe степени данная
процедура может довольно долго работать.
В таких случаях целесообразно использо-
вать нижеприведенную процедуру.
На входе: A,H,L - вoзвoдимoe число,C =
степень.
На выходе: A,H,L - результат.
;A,H,L=A,H,L'C
STEPEN2 LD B,8 ;счетчик цикла
CYCLSTP RLC C ;поиск значащего
DEC B ;разряда
JR Z,ZERSTP
JR NC,CYCLSTP
LD (LHL2+1),HL ;сохранение под-
LD (LA2+1),A ;степенного числа
CYCSTP2 PUSH BC
LD B,A ;текущее число воз-
LD D,H ;водим в квадрат
LD E,L
CALL MULTI
POP BC
RLC C ;выборка текущего
PUSH BC ;разряда степени
JR NC,ENDCYCL
PUSH BC ;выбранный разряд=1
LHL2 LD DE,#0000 ;домножаем текущий
LA2 LD A,#00 ;результат на под-
CALL MULTI ;степенное число
POP BC
ENDCYCL DJNZ CYCSTP2 ;цикл
RET
ZERSTP EXX ;обработка нулевой
LD A,0 ;степени
LD HL,1
RET
Подпрограмма умножения для процедуры
возведения в степень
На входе: A,H,L - первый множитель,В,D,E
- второй множитель.
На выходе: A,H,L - результат, переменная
FLAG=0 нет переполнения, FLAG<>0 перепол-
нение.
;A,H,L=A,H,L*B,D,E
MULTI EXX
LD B,24
LD HL,#0000
LD C,H
PF2 EXX
SRL B
RR D
RR E
JR NC,PFЗ
PUSH AF
PUSH HL
EXX
POP DE
ADD HL,DE
ADC A,C
LD C,A
EXX
POP AF
PFЗ SLA L
RL H
RLA
CALL C,FLAGC
EXX
DJNZ PF2
LD A,C
RET
FLAGC LD A,(FLAG) ;переполнение
OR #FF
LD (FLAG),A
RET
FLAG DB #00 ;#FF=C,00=NC
_______________________________
Other articles: