18+
реклама
18+
Бургер менюБургер меню

Arsen Gonian – Язык программирования Форт (Forth). Решение задач по программированию. Версия 2. (страница 11)

18

A isn't unique ()

B isn't unique ()

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

: B23 ( -> )             \ стековая нотация по прежнему пуста

A @ B @ C @       \ -> A B C

A ! C ! B !       \ A=C C=B B=A

;

1 A ! 2 B ! 3 C ! B23 A @ . B @ . C @ .

3 1 2 Ok

A=3, B=1, C=2.

рис 36

Для вещественного аргумента нужны соответствующие переменные.

FVARIABLE FA FVARIABLE FB FVARIABLE FC

: B23 ( -> )                   \ стековая нотация по прежнему пуста

FA F@ FB F@ FC F@       \ -> A B C

FA F! FC F! FB F!       \ C=A B=C A=B

;

1E FA F! 2E FB F! 3E FC F! B23 FA F@ F. FB F@ F. FC F@ F.

3.0000000 1.0000000 2.0000000 Ok      \ FA=3 FB=1 FC=2

Инициализация и вывод слова «1E FA F! 2E FB F! 3E FC F! B23 FA F@ F. FB F@ F. FC F@ F.» получились не короче самого слова. Оформите в отдельное слово для обоих вариантов самостоятельно.

рис 37

Пример 24. Аналогичен предыдущему с перемещением содержимого по схеме: A -> C-> B -> A.

Переменные используем с предыдущего примера.

: B24 ( -> )             \ стековая нотация пуста

A @ B @ C @       \ -> A B C

B ! A ! C !       \ B=C A=B C=A

;

1 A ! 2 B ! 3 C !             \ инициализация A=1 B=2 C=3

Ok

B24                   \ вызов нашей функции

Ok

A @ . B @ . C @ .       \ A=2 B=3 C=1

2 3 1 Ok

Для вещественного аргумента.

: B24 ( -> )                   \ стековая нотация пуста

FA F@ FB F@ FC F@       \ -> A B C

FB F! FA F! FC F!       \ B=C A=B C=A

;

Проверим на аналогичных данных.

1E-1 FA F! 2E-1 FB F! 3E-1 FC F! B24       \ FA=0.1 FB=0.2 FC=0.3

FA F@ F. FB F@ F. FC F@ F.             \ FA=0.2 FB=0.3 FC=0.1

0.2000000 0.3000000 0.1000000 Ok

рис 38

рис 39

Пример 25. Вычислить значение функции, если дан аргумент. Опустим целочисленный вариант, его можете написать самостоятельно.

: B25 ( X -> F[X] )       \ F(X)=3*X^6-6*x^2-7

F**2             \ X -> X^2

FDUP -6E F*       \ X^2 -> X^2 -6*X^2

–7E F+             \ X^2 {-6*X^2} -> X^2 {-6*X^2-7}

FSWAP             \ X^2 {-6*X^2-7} -> {-6*X^2-7} X^2

3E F**             \ {-6*X^2-7} X^2 -> {-6*X^2-7} {X^2}^3=X^6

3E F* F+       \ {-6*X^2-7}+{3*X^6}

;

1E B25 F.

–10.000000 Ok                  \ F(1)=-10

1E-3 B25 F.

–7.0000060 Ok                  \ F(0.001)=– 7.0000060

рис 40

А вот при аргументе равным нулю выдает ошибку (возведение нуля в степень):

0E B25 F.

EXCEPTION! CODE:C0000090 ADDRESS:0055384E WORD:F**

USER DATA: 007005BC THREAD ID: 00002120 HANDLER: 0019EF98

STACK: (0) 5BF752DB 00328000 76F066DD 0019FFDC 74C30400 00328000 [74C30419]

RETURN STACK:

0019EF84 : 0056DC53 B25