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.


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

Похожие статьи:
Информация - Что и как можно записывать в эхо-области. Правила конференции ZX.SPECTRUM : тематика,форма обмена информацией, языки,что запрещается...
Система - Описание программ : ZX-ASM3.0, Universal XAS Converter v2.1, Format Utility v2.01, Commander DOS v1.9, Super Catalog v1.12, Text Designer v1.0, The Dizzy Editor v1.0, Digital Studio for Covox, Alfasoft Music Crasher v2.13. Драйвер печати шрифтов , созданных в Mach v2.4.
ENLIGHT RULEZ?! - ENLIGHT 1997 - к чему он прирулит? (день шестой).
Scene - интервью с группой OCA взятое на CAFe'2002.
Капля припоя - GENERAL SOUND: PLUG & PLAY.

В этот день...   18 февраля