High Arsen Gonian Academy. Arsen Gonian
Чтение книги онлайн.

Читать онлайн книгу High Arsen Gonian Academy - Arsen Gonian страница 6

Название: High Arsen Gonian Academy

Автор: Arsen Gonian

Издательство: Автор

Жанр:

Серия:

isbn:

isbn:

СКАЧАТЬ задачка на вычисление среднего арифметического двух целых чисел:

      : B8 ( A B -> [A+B]/2 ) + 2/ ;

      1 3 B8

      Ok ( 2 )

      Мини-код работает правильно (1+3)/2=2. Ниже приведем код для вещественного аргумента:

      : B8 ( A B -> [A+B]/2 )

      F+ 2E F/ ;

      1E-1 2E-1 B8 F.

      0.1500000 Ok

      0.15 = (0.1+0.2)/2 – ИСТИНА

      Пример 9. Среднее геометрическое двух чисел – это квадратный корень из их произведения. Сразу напишем код для вещественного аргумента, так как возможности извлечение корня для целых чисел в системе SP-Forth нет, для этого придётся переводить целое число в вещественное извлечь квадратный корень, затем перевести обратно в целый вид, поэтому здесь такие хлопоты не оправданы, но если где-то вам это понадобится, то такое возможно.

      : B9 ( A B -> SQRT[A*B] )

      F* FSQRT ;

      Очень короткий и понятный код, который тестируем ниже:

      3E-1 75E-1 B9 F.

      1.5000000 Ok                  \ 1,5 = Корень_Квадратный_из(0,3*7,5) – ИСТИНА

      Этот и предыдущий примеры можно оформить красиво, для дальнейшего использования в математических вычислениях или в других программах, как ваши библиотечные функции.

      : MIDDLE_ARITHMETIC ( A B -> [A+B]/2 )      F+ 2E F/ ;

      : MIDDLE_GEOMETRIC ( A B -> SQRT[A*B] )      F* FSQRT ;

      За грамотные английские названия не ручаюсь.

      Пример 10. Вход два числа, не равные нулю. Вычислим сумму, разность, произведение и частное их квадратов, те есть:

      : B10 ( A B -> A^2+B^2 A^2-B^2 A^2*B^2 A^2/B^2 )

      SWAP DUP * SWAP DUP *      \ A B ->A^2 B^2

      2DUP +                        \ A^2 B^2 -> A^2 B^2 (A^2+B^2)

      ROT ROT 2DUP –            \ A^2 B^2 (A^2+B^2) -> (A^2+B^2) A^2 B^2 (A^2-B^2)

      ROT ROT 2DUP *            \ (+) A^2 B^2 (-) -> (+) (-) A^2 B^2 (A^2*B^2)

      ROT ROT /                  \ (+) (-) A^2 B^2 (*) -> (+) (-) (*) (A^2/B^2 )

      ;

      Протестируем на числах 4 и 2.

      4 2 B10

      Ok ( 20 12 64 4 )

      Всё корректно, проверяйте самостоятельно. В комментариях я сократил сумму, разность и произведение квадратов до соответствующих операций в скобках. Специально подобраны такие числа, чтобы результат деления был целочисленным, но это не обязательно – код для вещественных аргументов избавит нас от таких неудобств:

      : B10 ( A B -> A^2+B^2 A^2-B^2 A^2*B^2 A^2/B^2 )

      FSWAP FDUP F*      \ A B -> B A^2

      FSWAP FDUP F*      \ B A^2 -> A^2 B^2

      FOVER FOVER F+      \ A^2 B^2 -> A^2 B^2 (A^2+B^2)

      FROT FROT FOVER FOVER F-      \ A^2 B^2 (A^2+B^2) -> (A^2+B^2) A^2 B^2 (A^2-B^2)

      FROT FROT FOVER FOVER F*      \ (+) A^2 B^2 (-) -> (+) (-) A^2 B^2 (A^2*B^2)

      FROT FROT F/                  \ (+) (-) A^2 B^2 (*) -> (+) (-) (*) (A^2/B^2)

      ;

      Тест примера 10:

      1E-1 2E-1 B10 F. F. F. F.

      0.2500000 0.0004000 -0.0300000 0.0500000 Ok

      Не забываем, что оператор F. Печатает число с вершины стека, поэтому сначала напечатается частное, затем произведение, после чего разность и в конце сумма.

      0,25 = 0,01/0,04; 0,0004 = 0,01*0,04; -0,03 = 0,01-0,04; 0,05 = 0,01+0,04.

      Если вам нужен другой порядок вывода результатов, то самостоятельно решите эту задачу.

      BEGIN 11-20

      Пример 11. Отличается от 10-ого примера незначительными поправками. Просто заменяем квадрат на модуль: код «DUP *» на «ABS».

      : B11 ( A B -> {|A|+|B|} {|A|-|B|} {|A|*|B|} {|A|/|B|} )

      SWAP СКАЧАТЬ