2×
2× (удвоить, читается «два-умножить») — адаптированное слово Каллисто. Умножение на 2 (двоичный сдвиг влево).
2× ( x -- x1 ) Удвоить. x1 ← x × 2
Слово 2× умножает x на 2, результат x1 заносит в стек. x должно быть меньше 5E99.
Ввод слова 2×
В режиме NUM последовательно нажмите две белые клавиши 2 ×
2∗ в стандарте ANS Forth
6.1.0320 2∗ "two-star" CORE ( x1 -- x2 ) x2 - результат смещения x1 на один бит к старшему двоичному разряду, заполнение освобожденного младшего бита нулем.
A.6.1.0320 2∗ Исторически 2∗ было реализовано на машинах с дополнительным кодом (дополнение до двух) как логическая команда левого сдвига. Умножение на два - эффективный побочный эффект на этих машинах. Однако смещение подразумевает знание значения и позиции битов в ячейке. В то время как имя подразумевает умножение, большинство разработчиков использует аппаратный сдвиг влево для реализации 2∗.
История
Слово 2× известно в Форте, как 2∗ и входит во все стандарты, начиная с 1979 года.
Каллистянское слово 2× способно удваивать не только целые, но и числа с плавающей запятой.
2∗ в предыдущем стандарте Forth-83 (англ.)
2* w1 -- w2 83 "two-times" w2 is the result of shifting w1 left one bit. A zero is shifted into the vacated bit position.
2∗ в стандарте Forth-79 (англ.)
2* n1 -- n2 "two-times" Leave 2*(n1).
Реализация
Если на вершине стека находится целое число в диапазоне от -238 до 238, слово 2× сдвигает его влево на один двоичный разряд. Знак числа сохраняется. Слово 2/ осуществляет обратное действие, арифметический сдвиг вправо.
Каллисто реализована поверх десятичной машины «Электроника МК-161», поэтому поведение слова 2× может не всегда соответствовать тому, как оно реализовано на двоичных форт-машинах.
Если x≥5E99, происходит переполнение. Обработка этой ошибки производится встроенной программой. Например, последовательность слов 5E99 2× вызывает аварийный останов Каллисто с сообщением «Переполнение» в строке комментариев. Можно ввести с клавиатуры произвольное число в качестве значения «10100» и вернуться в Каллисто, нажав С/П . Подробнее см. статью Авост Каллисто.
В случае аварийного останова рекомендуется произвести «холодную перезагрузку» Каллисто с удалением всех введённых слов, нажав последовательно клавиши В/О С/П .
Слово 2× в Каллисто 1.0 является примитивом:
1287 NONEP: PKRM03 + PKM03 KGOTO9 … 1290 JMUL2: PKRM03 GOTO NONEP … 1306 ;#TwoTimes 1307 ; 2× ( x −− x1 ) Удвоить. x1 := x×2 1308 LMUL2: .DB 2 1309 .TEXT "2" ; "2∗" ( x −− 2∗x ) 1310 .DB 179 ; Символ умножения МК−161 1311 .DW LONEM 1312 MUL2: .DW JMUL2 ; Умножение на 2 (двоичный сдвиг влево).
Также оно может быть реализовано так:
: 2× ( x -- 2x ) ↑ + ;
Реализация из SP-Forth 4.20:
CODE 2* LEA EAX, [EAX*2] RET END-CODE
Советская реализация
В ядре ФОРТ-ЕС слово 2× называлось 2∗
Вот его описание и определение:
2* + W1->W2 АРИФМЕТИЧЕСКИЙ СДВИГ ВЛЕВО НА 1 20 Экран номер 20 ( 31.03.86 SP@ SP! RP@ RP! 2/ 2* 2@ 2! DEPTH ) : 2* ( W1->W2 ) DUP + ;
В FORTH ИТЭФ слово 2× называлось также 2∗ и было примитивом, вот его определение:
HEAD 202Q,'2',252Q,MUL2 ; 2* POP AX SAL AX, 1 PUSH AX NEXT
Ссылки
- Исходный текст слова 2× в Каллисто Классик 1.0
- См. слова ×, 2/, 2+ и 2−
- См. также символ ×
- Слово 2∗ (two-star) и комментарий к нему в стандарте ANS Forth (англ.)
- Слово LSHIFT в стандарте ANS Forth (англ.)
- Слова 2∗ (two-star) и LSHIFT в черновике Forth 200x (англ.)
- Битовый сдвиг в Википедии
- Logical shift и Arithmetic shift в английской Википедии (англ.)
- ОПЕРАЦИИ НАД ЦЕЛЫМИ ЧИСЛАМИ в книге Л.Броуди «Начальный курс программирования на языке Форт»
- ЧИСЛО ТИПОВ ЧИСЕЛ в книге Л.Броуди «Начальный курс программирования на языке Форт»
- The Philosophy of Fixed Point в книге Leo Brodie Starting Forth (англ.)
- A Number of Kinds of Numbers в книге Leo Brodie Starting Forth (англ.)
Это заготовка статьи. Вы можете помочь проекту, дополнив её. |