×/MOD

Материал из ПМК вики
Перейти к навигации Перейти к поиску

×/MOD (масштабирование с остатком) — адаптированное слово Каллисто. Операция масштабирования с остатком.

×/MOD          ( z y x −− y1 n )                    Получение частного n и остатка y1 от деления
                                                    произведения z × y на x.

Слово ×/MOD кладёт на стек остаток и частное от деления произведения z × y на x. Произведение z × y вычисляется с точностью 14 десятичных знаков.

Ввод слова ×/MOD[править]

В режиме NUM последовательно нажмите клавиши  ×     F   ÷     Р-ГРД-Г   ÷   5   K 

Для возврата в режим NUM нажмите синюю клавишу  P .

∗/MOD в стандарте ANS Forth[править]

 6.1.0110   ∗/MOD                         "star-slash-mod"                  CORE
            ( n1 n2 n3 -- n4 n5 )
            Умножает n1 на n2, с промежуточным результатом двойная-ячейка d. 
            Делит d на n3, выдает остаток одна-ячейка n4 и частное одна-ячейка 
            n5. Неопределенная ситуация существует, если n3 нулевое или если 
            частное n5 находится вне диапазона числа одна-ячейка со знаком. 
            Если d и n3 отличаются по знаку, возвращенный результат, 
            определенный реализацией будет тот же самый, как и возвращаемый 
            фразой >R M∗ R> FM/MOD или фразой >R M∗ R> SM/REM.

        См.: 3.2.2.1 Целочисленное деление.

История[править]

Слово ×/MOD в Форте называется ∗/MOD и прослеживается с 1979 года.

∗/MOD в предыдущем стандарте Forth-83 (англ.)[править]

     ∗/MOD        n1 n2 n3 -- n4 n5             83  "times-divide-mod"
          n1 is first multiplied by n2 producing an intermediate 32-
          bit result.  n4 is the remainder and n5 is the floor of the
          quotient of the intermediate 32-bit result divided by the
          divisor n3.  A 32-bit intermediate product is used as for
          ∗/ .  n4 has the same sign as n3 or is zero.  An error
          condition results if the divisor is zero or if the quotient
          falls outside of the range {-32,768..32,767}.  See:
          "division, floored"

∗/MOD в стандарте Forth-79 (англ.)[править]

∗/MOD          n1 n2 n3 -- n4 n5             192 "times-divide-mod"
    Multiply  n1  by  n2,  divide the result by n3 and  leave  the
    remainder n4 and quotient n5.   A 32-bit intermediate  product
    is used as for ∗/ .  The remainder has the same sign as n1.

∗/MOD в fig-FORTH Release 1 glossary, май 1979 (англ.)[править]

∗/MOD           n1 n2 n3 --- n4 n5              L0
       Leave the quotient n5 and remainder n4 of the operation n1∗n2/n3 A
       31 bit intermediate product is used as for ∗/.

Реализация[править]

1412 ;#TimesSlashMOD
1413 ; ×/MOD            ( z y x −− y1 n )                    Получить частное n и остаток y1 от деления произведения z×y на x.
1414 ; Остаток y1 и частное n от деления произведения z∗y на x.
1415 ; Промежуточный результат z∗y содержит 14 десятичных разрядов.
1416 LSSMOD:         .DB     5
1417                 .DB     179                     ; Символ умножения МК−161.
1418                 .TEXT   "/MOD"                  ; "∗/MOD" ( множитель1 множитель2 делитель −− остаток частное)
1419                 .DW     LSSLA
1420 SSMOD:          .DW     JSSMOD
1421 JSSMOD:         RM3 M8 1 + MA M3 1 + MB
1422                 KRMB KRMA ∗ ENT KRM8 / FANS <−> KINT KMA ∗ − KMB
1423                 KGOTO9

Реализация из SP-Forth 4.20:

CODE */MOD ( n1 n2 n3 -- n4 n5 ) \ 94
\ Умножить n1 на n2, получить промежуточный двойной результат d.
\ Разделить d на n3, получить остаток n4 и частное n5.
       MOV     ECX, EAX
       MOV     EAX, [EBP]      \ n2
       IMUL    DWORD 4 [EBP]   \ n1*n2
       IDIV    ECX             \ n1*n2/n3
       MOV     4 [EBP], EDX    \ rem
       LEA EBP, 4 [EBP]
       RET
END-CODE

Советская реализация[править]

Слово ×/MOD ФОРТ-ЕС и FORTH ИТЭФ называлось ∗/MOD и определялось через примитивы M∗ и M/

Вот описания и определения этих слов в ядре ФОРТ-ЕС:

  */MOD       N1,N2,N3->N4,N5                    ОСТАТОК N4 И ЧАСТНОЕ N5  18
                                     ОТ ДЕЛЕНИЯ ПРОИЗВЕДЕНИЯ N1*N2 НА N3
M*        T  N1,N2->D ПРОИЗВЕДЕНИЕ ДВОЙНОЙ ДЛИНЫ N1 И N2        18
M/        *  D,N1->N2,N3 ОСТАТОК N2 И ЧАСТНОЕ N3 ОТ             18
             ДЕЛЕНИЯ ДВОЙНОГО D НА ОДИНАРНОЕ N1

                     Экран номер 18
( 03.10.84     М* M/ * /MOD / MOD */MOD */)

CODE M* ( N1,N2->D) RH1 SECOND LH, RW1 FIRST MH, 2PUTRW1 B,
CODE M/ ( D,N1->N2,N3) 1 POP, 14 LRW1 SAL, RSTACK RTWO SR,
 RW1 32 SRDA, 0,RW1 LR,  RW1 1 DR, 0 1 XR, 0 0 LTR, ?M IF,
 RW1 1 AR, RW2 0 BCTR, THEN, RW1 FIRST 4 +(, STH,
 RW1 RM2 LR,  ( ЧАСТНОЕ) POPPUT1 B,   END-CODE

: */MOD ( N1,N2,N3->N4,N5)  >R M* R> M/ ;

Вот описания и определения этих слов в FORTH ИТЭФ:

             HEAD    202Q,'M',252Q,MSTAR                  ; M*
             POP   AX
             POP   CX
             IMUL  CX
             PUSH  AX
             PUSH  DX
             NEXT
             ...
            HEAD     202Q,'M',257Q,MSLAS                  ; M/
            POP   CX          ; Делимое
            POP   DX
            POP   AX
            IDIV  CX
            PUSH  DX
            PUSH  AX

            NEXT
             ...
             HEAD    205Q,'*/MO',304Q,SSMOD,$COL          ; */MOD
             DW  TOR,MSTAR,FROMR,MSLAS,SEMI

Ссылки[править]


  Nopictures-icon.png У этой статьи нет иллюстраций. Вы можете помочь проекту, добавив их.


  Stub-icon-48px.png Это заготовка статьи. Вы можете помочь проекту, дополнив её.