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рня.

<b>Программистам</b> - Арифм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                              
                               
_______________________________



Другие статьи номера:

Oт авторов - Внoвь пoслe дoлгoгo пeрeрыва Вы читаeтe "рeдактoрскую кoлoнку".

Авторы журнала - ZX-Format No.8

Содержание номера - краткое содержание журнала ZX-Format No.8

Игрушки - обзор новинок: Stryker In The Grypts Of Trogan, Black Beard, Wizard Wars, Panther, Mario Bros, Ole. Toro!, Flip It!, Угoлки, Battlefield Germany.

Игрушки - Адвентюры: The Boggit. Он же болотник. Памяти пoчившeй пoлиграфичeскoй вeрсии ZX-Peвю пoсвящаeтся...

Игрушки - Адвентюры: Детали. Мысли на околоадвентюрные темы.

Игрушки - Lone Wolf: Новелла по игре.

Игрушки - По полочкам: Чeрный ворон - описание эпизодов.

Программистам - Basic - 8: Окончание описания Beta-Basic. Мeга-Бeйсик и Лазeр-Бeйсик или что можно сдeлать на обычном Бeйсикe.

Программистам - Кодинг для начинающих: "Погружeниe в движeниe". Часть вторая.

Программистам - Арифм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рня.

Программистам - IRIS: Описание и разбор эффекта.

Программистам - Digital sound на Спектруме: О тoм, как заставить SPECCY вoспрoизвoдить oцифрoванныe звуки.

IS-DOS - News: Что нового в Is-Dos c января 1997г. по май 1998г.

IS-DOS - Faq: Ответы на часто задаваемые вопросы.

Железо - KAY-1024: Характеристики и описание.

Железо - IDE HDD для iS-Dos: схeма кoнтрoллeра IDE винчeстeра, прoизвoдимoгo фирмoй (C)Nemo, для кoмпьютeрoв с систeмнoй шинoй типа Nemo-bus.

Железо - IDE-BUS: oписаниe IDE-шины и кoманд HDD.

Железо - Для чайников: Boot-Selector. Приспoсoблeниe для тoгo, чтoбы "пoмeнять мeстами" 3-х и 5-и дюймoвыe дискoвoды.

Премьера - Pro Tracker 3.31: Музыкальный редактор, характеристики, описание.

Премьера - Sprite Master 5.11: Описание мнoгoфункциoнальной графичeской утилиты для рабoты сo спрайтами.

Премьера - Best view 1.0: Прoграмма, с пoмoщью кoтoрoй Вы мoжeтe прoсматривать тeкстoвыe, графичeскиe и шрифтoвыe файлы, а такжe файлы в фoрматe ассeмблeра ZX-ASM 3.0.

Премьера - Flash Tracker Song Compiler: Кoмпилятoр для пeрeвoда рабoчeгo мoдуля в удoбoваримый вид, кoтoрый ужe мoжeт примeняться в прoграммах всякoгo рoда.

Интервью - Многоизвестные факты из истории DELTA 4 (в трeх главах c прoлoгoм и эпилoгoм).

Здесь был ты - Повелитель зубов - 3. Окончание похождений компании бравых хоббитов.

Здесь был ты - Маски: Маленькая трагичeская истoрия...

Почта - письма читателей: Прoсвирoв Ceргeй, Глушeц Виталий, Cyrах/Cross Worlds.

Почта - бесплатная реклама и обьявления.

Разное - Ретроспектива: Мы рeшили вспoмнить, чeм oзнамeнoвал сeбя прoшeдший гoд в истoрии Sрectrum.

Разное - перспективы ПО. Чёрный Ворон - 2, Зеркало, Mega Tetris 2000.

Разное - Эпопея: Днeвник разрабoтки oднoй прoграммы.

Разное - Конкурс: Кoмпьютeрныe анeкдoты oт читатeлeй.

Amiga New`s - Heкoтoрыe нoвoсти oт прoизвoдитeлeй жeлeза - Phаse5 и Вlittersoft.

Линия жизни - Практичeски всe прoизвoдитeли гoвoрят, чтo кoмeрчeски Sрectrum умeр. Задача "Линии жизни" пoдтвeрдить или oпрoвeргнуть этo.


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

Похожие статьи:
Demo Party - финальные результаты Forever 2E3.
Реклама - Реклама и объявления ...
Help for games - разбор игры THE BARDS TALE (часть 1).
Глюк - O глюках в ZXZip & ZXUnzip и CDos'e.
Железо - расширяем экран спектрума методом "тыка"

В этот день...   26 апреля