31 декабря 1997

Арифметика 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:


Темы: Игры, Программное обеспечение, Пресса, Аппаратное обеспечение, Сеть, Демосцена, Люди, Программирование

Similar articles:
Smiley - ordinary jokes.

В этот день...   23 November