Начальный курс программирования на языке Форт


ФОРМАТИРОВАНИЕ ЧИСЕЛ ОДИНАРНОЙ ДЛИНЫ СО ЗНАКОМ - часть 2


В системах Форт-79 и Форт-83, а также Форт-системах МУР и MMS используется соглашение о передаче знака через вершину стека, что в большей степени соответствует механизму передачи данных через стек.

Если вы располагаете старой версией, определите SIGN следующим образом:

: SIGN ( n -- ) 0< IF ASCII - HOLD THEN ;

Определим слово, которое выводило бы число двойной длины со знаком с десятичной точкой и двумя десятичными значениями после точки. Поскольку такая форма часто используется для представления какой-либо суммы в долларах и центах, назовем это cлово .$ и определим его следующим образом:: .$ ( d -- ) DUP >R DABS <# # # ASCII . HOLD #S R> SIGN ASCII S HOLD #> TYPE SPACE ;

Проверим его: 2000.00 .$ $2000.00

или даже так:2,000.00 .$ $2000.00

Рекомендуем вам сохранить определение .$, которое пригодится нам в дальнейшем в некоторых примерах.

Вы можете также описать форматы чисел одинарной длины. Например, если вы хотите использовать число одинарной длины без знака, то просто поместите в стеке перед словом <# нуль. Такое число одинарной длины легко превратить в число двойной длины, которое настолько мало, что его часть, содержащаяся в верхней по порядку ячейке, равна нулю,

Для представления числа одинарной длины со знаком вам достаточно поместить нуль в старшую по порядку ячейку. Но вы также должны сохранить копию числа со знаком для SIGN и, кроме того, оставить абсолютное значение этого числа во втором элементе стека. Все необходимые действия выполняет следующее выражение: ( n -- ) DUP >R ABS 0 <# #S R> SIGN #>

Ниже приводятся «стандартные» выражения, которые применяются для вывода различных видов чисел: СЛОВУ <# ПРЕДШЕСТВУЕТ ВЫВОДИМОЕ ЧИСЛО ВЫРАЖЕНИЕ 32-разрядное без знака (ничего) 31-разрядное плюс знак DUP >R DABS (чтобы сохранить знак в третьем элементе стека для SIGN) 16-разрядное без знака 0 (чтобы получить фиктивную, старшую по порядку, часть) 15-разрядное плюс знак DUP >R ABS 0 (чтобы сохранить знак)




Начало  Назад  Вперед