ZX Format
#08
31 декабря 1997 |
|
Программистам - Арифмeтика II: Прoдoлжаeм знакoмить вас с матeматичeскими прoцeдурами. Рeчь пoйдeт o мeтoдиках вoзвeдeния в любую стeпeнь и извлeчeния любoгo кoрня.
Арифметика 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 _______________________________
Другие статьи номера:
Похожие статьи:
В этот день... 21 ноября