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

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

18

5E-1 или 5e-1

До E – это мантисса (число), после экспонента (степень). Мантисса и экспонента могут быть как положительными (знак не требуется), так и отрицательными (в данном случае степень -1, что значит 10 в минус первой степени).

После ввода, вещественное число размещается на соответствующем ей вещественном стеке. Поэтому мы не видим его после вывода слова Ok в скобках, так как это другой стек для целых чисел. Чтобы его увидеть нужно ввести «F.». Итак, чтобы проверить, что всё работает как надо, введём код:

5E-1 F.

В ответ увидим:

0.5000000 Ok

Слово «F.», аналогично, как и «.» выводит число на экран, только не с целочисленного стека, а с вещественного.

Теперь мы можем переписать пример 4 для вещественных аргументов:

: B4 ( D -> L ) \ L=Pi*D

314E-2 F* ;

Вместо 314E-2 можно набрать 3.14E, результат тот же. Посчитаем длину окружности диаметром 0,5, набрав следующее:

5E-1 B4 F. \ вызываем слово, которое считает длину окружности и «F.» печатает его результат

1.5700000 Ok

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

Пример 1:

: B1 ( A -> P ) 4E F* ; \ P=4*A

Знак «*» заменяется на «F*», четверка вводится как вещественное число (операция «F*», в отличие от «*» производит операцию над вещественными числами на вещественном стеке). Теперь проверим, посчитаем периметр квадрата со стороной 0,5:

5E-1 B1 F.

2.0000000 Ok

Ответ 2 (0,5*4=2) что является правдой.

Данный пример, так же можно преобразовать, написав в стиле:

: B1 ( A -> P ) \ P=4*A

4E F*

;

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

Пример 2:

: B2 ( A -> S ) FDUP F* ; \ S=A^2

Опять DUP превращается в FDUP, умножение как в первом случае. Проверим работу слова. Посчитаем площадь квадрата со стороной 0,5:

5E-1 B2 F.

0.2500000 Ok \ 0,5*0,5 = 0,25

Иллюстрация примеров 1,2 и 4 для вещественных аргументов:

рис 11

Пример 3: Расчет площади и периметра прямоугольника.

: B3 ( A B -> S P ) \ ( S=A*B P=2*(A+B) )

FOVER FOVER \ A B -> A B A B

F*             \ A B A B -> A B A*B=S

FROT FROT       \ A B S -> S A B

F+ 2E F*       \ S A B -> S (A+B)*2=P

;

Первая строка стандартное, уже знакомое начало слова на Форте. Далее:

Вторая строка «FOVER FOVER ( A B -> A B A B )». Слова 2FDUP – нет в словаре, «FOVER» копирует элемент под вершиной вещественного стека на вершину, двойное повторение аналогично целочисленному «2DUP».

Третья – умножение двух чисел на вершине вещественного стека. Получаем площадь прямоугольника.

Четвертая, как и для целочисленного варианта слова (ROT заменяется на FROT).

Пятая сложение двух чисел на вершине вещественного стека и удвоение результата.

Шестая завершение слова, в итоге на вершине стека получаем 2 числа – площадь и периметр.

Проверим работу слова B3 на сторонах прямоугольника 0,2 и 0,3:

2E-1 3E-1 B3 FSWAP F. F.

0.0600000 1.0000000 Ok

Как можете увидеть ниже всё работает верно:

S = 0,2*0,3=0,06

P=2*(0,2+0,3)=2*0,5=1

0,2 и 0,3 можно вводить и в следующем виде: 0.2E и 0.3E. Самостоятельно можете убедиться, что слово «F.» выведет на экран тоже самое значение.

Код «2E-1 3E-1 B3 FSWAP F. F.» можно собрать в отдельное слово, если не приятно работать с таким количеством команд:

: B3. ( S P -> S. P. ) B3 FSWAP F. F. ;

Ok

2E-1 3E-1 B3.

0.0600000 1.0000000 Ok

Согласно логике Форта «B3.» аналогично «.» означает печать результатов слова «B3».

Вы можете спросить зачем такие сложности? Код становится универсальным, мы отделяем вычисляемую часть от метода вывода данных на экран, его можно использовать при определении других слов, включать в свои библиотеки, и использовать в других задачах как отдельную функцию.

Вы можете заметить, что, в примере 3, каждая строка кода сопровождается комментарием, которая поясняет изменения на стеке. Так как все операции и манипуляции, в данном примере, производятся только с вещественным стеком, мы это никак не обозначаем, когда слово будет работать с обоими стеками сразу, вещественный стек будем выделять так: «F: A B A*B=S -> S A B», изменения целочисленного стека дополнительно выделять не будем. Существует еще и стек возвратов. Будьте осторожны, любые неосторожные манипуляции приведут к некорректным результатам, в лучшем случае, в худшем вызовут сообщения об ошибке.

Так же обратите внимание, что комментарии выравниваются так чтобы они выстроились в вертикальную линию, даже те строчки, в которых нет кода, исключительно для удобства чтения (транслятор Форта «проглотил» знаки табуляции, поэтому между кодом и комментарием остался 1 пробел).

рис 12

Пример 5. Здесь вычисляется объем куба и площадь его боковой поверхности. Вначале приведем работу с целочисленным аргументом.

: B5 ( A -> V=A^3 S=6*A^2 )

DUP 2DUP      \ A -> A A A A