×/

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

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

×/             ( z y x −− n )                       Делить произведение z × y на x.
                                                    n := Trunc [z × y/x]
Слово ×/ требует практики.
Картинка из книги Лео Броди «Starting FORTH»

n — результат умножения z на y с последующим целочисленным делением на x.

Произведение z × y, промежуточный результат операции, вычисляется с точностью 14 десятичных знаков.

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

В режиме NUM последовательно нажмите три клавиши  ×     F   ÷ 

Пример[править]

Фраза  12345 355 113 ×/  умножает 12345 на дробь 355/113, которая представляет число $\pi$ с точностью 8,5e-8 (Броуди, 1981). Хотя подобный подход избыточен на Каллисто, он позволял писать на целочисленном Форте высокопроизводительные вычислительные программы, например для управления радиотелескопом.

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

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

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

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

Впервые операция масштабирования ×/ под именем ∗/ появилась в Форте 1971-73 годах, когда Чак Мур перенёс транслятор на DEC PDP-11 в National Radio Astronomy Observatory (англ., Шарлотсвилл).

Слово ∗/ использовало аппаратное умножение двух 16-битных чисел для получения 32-битного произведения. Разумеется, аргументы брались со стека данных. Затем результат делился для реализации рациональной арифметики.

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

     ∗/           n1 n2 n3 -- n4                83      "times-divide"
          n1 is first multiplied by n2 producing an intermediate 32-
          bit result.  n4 is the floor of the quotient of the
          intermediate 32-bit result divided by the divisor n3.  The
          product of n1 times n2 is maintained as an intermediate 32-
          bit result for greater precision than the otherwise
          equivalent sequence: n1 n2 ∗ n3 / .  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"

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

∗/             n1 n2 n3 -- n4                220     "times-divide"
    Multiply  n1  by  n2,  divide the result by n3 and  leave  the
    quotient n4.   n4 is rounded toward zero.   The product of  n1
    times  n2  is maintained as an intermediate 32-bit  value  for
    greater precision than the otherwise equivalent  sequence:  n1
    n2 ∗ n3 /

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

∗/            n1  n2  n3  ---  n4             L0
       Leave the ratio n4 = n1∗n2/n3 where all are signed numbers.
       Retention of an intermediate 31 bit product permits greater accuracy
       than would. be available with the sequence:
               n1  n2  ∗  n3  /

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

1398 ;#TimesSlash
1399 ; ×/               ( z y x −− n )                       Поделить произведение z×y на x. n := Trunc [x1×x2/x3]
1400 ; Операция масштабирования −− умножение z на y с последующим делением на x.
1401 ; Промежуточный результат умножения z∗y содержит 14 десятичных разрядов.
1402 ; Присутствует ещё в Форте−79, но везде обозначается ∗/
1403 LSSLA:          .DB     2
1404                 .DB     179                     ; Символ умножения МК−161.
1405                 .TEXT   "/"                     ; ( множитель1 множитель2 делитель −− частное )
1406                 .DW     LSLMOD                  ; ( a b c −− [a∗b/c] )
1407 SSLA:           .DW     JSSLA
1408 JSSLA:          RM3 M8 1 + MA 1 + MB M3
1409                 KRMB KRMA ∗ KRM8 / KINT KMB
1410                 KGOTO9

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

: */ ( n1 n2 n3 -- n4 ) \ 94
\ Умножить n1 на n2, получить промежуточный двойной результат d.
\ Разделить d на n3, получить частное n4.
  */MOD NIP
;

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

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

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

  */          N1,N2,N3->N4                ЧАСТНОЕ ОТ ДЕЛЕНИЯ N1*N2 НА N3  18

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

: */   ( N1,N2,N3->N4) */MOD SWAP  DROP ;

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

             HEAD    202Q,'*',257Q,SSLA,$COL              ; */
             DW  SSMOD,SWAP,DROP,SEMI

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


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