Чтение онлайн

ЖАНРЫ

High Arsen Gonian Academy
Шрифт:

FDEPTH \ Это слово возвращает количество элементов в вещественном стеке

Ok ( 0 ) \ 0 элементов

5E-1 FDEPTH \ введем 1-ое число

Ok ( 0 1 ) \ 1 элемент на вещественном стеке

5E-1 FDEPTH \ введем 2-ое число

Ok ( 0 1 2 ) \ 2 элемента

5E-1 FDEPTH \ введем 3-е число

Ok ( 0 1 2 3 ) \ 3

5E-1 FDEPTH \ введем 4-ое число

Ok ( 0 1 2 3 4 ) \ 4

5E-1 FDEPTH \ введем 5-ое число

Ok ( [6].. 1 2 3 4 5 )

5E-1 FDEPTH \ введем 6-ое число

Ok ( [7].. 2 3 4 5 6 )

5E-1 FDEPTH \ введем 7-ое

число

Ok ( [8].. 3 4 5 6 7 )

5E-1 FDEPTH \ ошибка !!!

Если после ошибки ввести «F.» получим:

infinity Ok

После ошибки лучше перезапустить SPForth. Так же не забывайте о подключении библиотек заново для работы с вещественными числами. Существует слово DEPTH для обычного стека, которое также оставляет количество его элементов, не считая возвращаемый параметр.

Теперь перепишем Пример 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. Среднее геометрическое двух чисел – это квадратный корень из их произведения. Сразу напишем код для вещественного аргумента, так как возможности извлечение корня для целых чисел в системе SPForth

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

: 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 ABS SWAP ABS \ A B ->|A| |B|

Поделиться с друзьями: