Скачать книгу

оставляет количество его элементов, не считая возвращаемый параметр.

      Теперь перепишем Пример 6 для вещественных чисел.

      : B6 ( A B C -> S V )      \ S=2*(A*B+B*C+A*C) V=A*B*C )

      FOVER FOVER F+      \ A B C -> A B C (B+C)

      FROT FROT F*            \ A B C (B+C) -> A (B+C) B*C

      FROT                  \ A (B+C) B*C -> (B+C) B*C A

      FOVER FOVER F*      \ (B+C) B*C A -> (B+C) B*C A B*C*A

      F.                  \ 1-ый результат – объем

      FROT F* F+ 2.E F*      \ (B+C) B*C A -> B*C+A*(B+C)

      F.                  \ 2-ой результат S=2*(A*B+B*C+A*C)

      ;

      Теперь можно проверить как работает написанное слово:

      1E-1 2E-1 3E-1 B6

      0.0060000 0.2200000 Ok

      Объем прямоугольного параллелепипеда 0,006=0,1*0,2*0,3 и площадь его поверхности 0,22=2*(0,1*0,2+0,2*0,3+0,1*0,3).

      Пример 7. Зная радиус окружности, посчитаем его длину и площадь.

      : B7 ( R -> L S)            \ L=2*Pi*R и S=Pi*R^2

      DUP 2* 314 *      \ R -> R R*2*314=L

      SWAP            \ R L -> L R

      DUP 314 * *      \ L R -> L R*R*314=S

      ;

      Целочисленный вариант принимает целое значение радиуса и выдает результат в 100 раз больше. Надеюсь по комментариям стековой нотации работа слова понятна (она довольно тривиальна).

      Код для вещественного аргумента:

      : B7 ( R -> L S)                  \ L=2*Pi*R и S=Pi*R^2

      FDUP 2E F* 314E-2 F*      \ R -> R 2*Pi*R=L

      FSWAP                  \ R L -> L R

      FDUP 314E-2 F* F*      \ L R -> L R*R*3.14=S

      ;

      Вычислим длину окружности и площадь круга радиусом 0,1:

      1E-1 B7 F. F.

      0.0314000 0.6280000 Ok

      0.0314000=0,1*0,1*3,14 и 0.6280000= 2*3,14*0,1. Результаты теста корректны.

      Пример 8. Простая задачка на вычисление среднего арифметического двух целых чисел:

      : 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 )

      Всё

Скачать книгу