Forth
http://fforum.winglion.ru/

числа формат, преобразование, представление
http://fforum.winglion.ru/viewtopic.php?f=36&t=2476
Страница 1 из 9

Автор:  mOleg [ Вс фев 28, 2010 17:46 ]
Заголовок сообщения:  числа формат, преобразование, представление

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

Автор:  mOleg [ Вс фев 28, 2010 17:47 ]
Заголовок сообщения: 

Итак, вопрос номер один. Преобразование а именно преобразование чисел в строковую (текстовую форму и обратно).
Нужна ли действительно двойная разрядность при проведении этих операций?

Автор:  VoidVolker [ Вс фев 28, 2010 18:42 ]
Заголовок сообщения: 

Не особо надо, вот лично мне вполне хватает одинарной разрядности.

Автор:  Hishnik [ Вс фев 28, 2010 18:43 ]
Заголовок сообщения: 

Несколько непонятно, в чем заключается вопрос. Необходимо адекватное представление чисел в текстовом виде, и корректное обратное преобразование. В ряде систем это делается путем реализации этих операций для чисел двойной разрядности (просто потому, что они там все равно используются и поддерживаются), а потом для экономии те же слова используются для чисел базовой разрядности.

Автор:  WingLion [ Вс фев 28, 2010 19:56 ]
Заголовок сообщения: 

mOleg писал(а):
Итак, вопрос номер один. Преобразование а именно преобразование чисел в строковую (текстовую форму и обратно).
Нужна ли действительно двойная разрядность при проведении этих операций?


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

Автор:  dynamic-wind [ Вс фев 28, 2010 21:08 ]
Заголовок сообщения: 

Достаточно той разрядности, которую имеют преобразуемые числа.
В частности, хватает и для того, чтобы обнаружить переполнение при преобразованиии строка->число.

Автор:  mOleg [ Пн мар 01, 2010 09:26 ]
Заголовок сообщения: 

Хищник писал(а):
Необходимо адекватное представление чисел в текстовом виде, и корректное обратное преобразование.

и это тоже но это обсуждалось по крайней мере предложения есть.
хотя, хочу заметить, что переменная BASE уже идеалогически устарела. Все стараются числа представлять таким образом, чтобы было сразу понятно в какой системе число. Кроме того, использование BASE так же не удобно при создании своих "распознавалок" форматов чисел.
Поэтому >NUMBER , к примеру, должен получать BASE в явном виде: ( asc # base --> asc # err | ud 0 ).

теперь, что касается преобразования чисел. Дело в том, что двойная арифметика не всегда нужна, а иногда и вредна (если памяти немного). Написать преобразование чисел из текстового представления во внутреннее и обратно для чисел одинарной длины проще, чем для чисел двойной, особенно, если доступная глубина стеков 1-2 ячейки и нет вспомогательных регистров. Именно об этом вопрос, ведь по сути не особо важно сколько параметров берут: # #S #> , а вот используются ли при этом S>D 2OVER 2SWAP DNEGATE UD/ или нет может оказаться несколько более критичным.

Автор:  mOleg [ Пн мар 01, 2010 09:28 ]
Заголовок сообщения: 

WingLion писал(а):
Может оказаться, что и двойной разрядности мало. Во всяком случае, если думать о преобразовании не только целых, но и float-ов

флоаты обычно преобразуются на другом стеке и в другом АЛУ, по крайней мере на PC

Автор:  chess [ Пн мар 01, 2010 09:47 ]
Заголовок сообщения: 

mOleg писал(а):
хочу заметить, что переменная BASE уже идеалогически устарела

Вот опять глобальная переменная, которая вносит ненужные завязки и усложнения.
100 - одинарное, основание decimal
100d - двойное, основание decimal
100q - четверное, основание decimal
100h - одинарное, основание hex
100dh - двойное, основание hex
100qh - четверное, основание hex
. .d .h .dh .q .qh и т.д. - вывод на печать и дальше в том же ключе
пс. о флоат-числах отдельный разговор

Автор:  Hishnik [ Пн мар 01, 2010 11:39 ]
Заголовок сообщения: 

mOleg писал(а):
хотя, хочу заметить, что переменная BASE уже идеалогически устарела.

Термин "идеологически" все же следует и правильно писать, и правильно применять :)
mOleg писал(а):
Все стараются числа представлять таким образом, чтобы было сразу понятно в какой системе число. Кроме того, использование BASE так же не удобно при создании своих "распознавалок" форматов чисел.

Представление чисел и их преобразование - это разные вещи. Дело ведь отнюдь не в том, содержится ли информация об основании системы счисления в записи числа, ведь текстовую строку надо как-то преобразовать. А вот для этого и нужно где-то хранить основание. Так почему не в BASE?
mOleg писал(а):
Кроме того, использование BASE так же не удобно при создании своих "распознавалок" форматов чисел.

"Свою распознавалку" без BASE в студию! :)
mOleg писал(а):
Поэтому >NUMBER , к примеру, должен получать BASE в явном виде: ( asc # base --> asc # err | ud 0 ).

И кто же ему это обеспечит? А также где будет хранить?
mOleg писал(а):
Написать преобразование чисел из текстового представления во внутреннее и обратно для чисел одинарной длины проще, чем для чисел двойной, особенно, если доступная глубина стеков 1-2 ячейки и нет вспомогательных регистров. Именно об этом вопрос, ведь по сути не особо важно сколько параметров берут: # #S #> , а вот используются ли при этом S>D 2OVER 2SWAP DNEGATE UD/ или нет может оказаться несколько более критичным.

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

Автор:  chess [ Пн мар 01, 2010 12:43 ]
Заголовок сообщения: 

Хищник писал(а):
Представление чисел и их преобразование - это разные вещи. Дело ведь отнюдь не в том, содержится ли информация об основании системы счисления в записи числа, ведь текстовую строку надо как-то преобразовать. А вот для этого и нужно где-то хранить основание. Так почему не в BASE?

Потому, что BASE переменная глобальная, со всеми вытекающими последствиями. Для форматного преобразования достаточно локальной переменной, которая существует только
в момент преобразования. Место где она хранится во время преобразовании особого значения не имеет(в регистре, на стеке возвратов, на стеке параметров, в хипе).

Автор:  mOleg [ Пн мар 01, 2010 13:30 ]
Заголовок сообщения: 

Хищник писал(а):
"Свою распознавалку" без BASE в студию!

<pre>
\ преобразовать символ в цифру √
: >CIPHER ( c --> u|-1 )
DUP [CHAR] 0 [CHAR] : WITHIN IF 48 - ;THEN
DUP [CHAR] A [CHAR] [ WITHIN IF 55 - ;THEN
DUP [CHAR] a [CHAR] { WITHIN IF 87 - ;THEN
DROP -1 ;

\ попытаться преобразовать символ char в цифру,
\ в системе счисления, определяемой base √
: DIGIT ( char base --> u TRUE | FALSE )
SWAP >CIPHER TUCK U>
IF TRUE ;THEN
DROP FALSE ;

\ добавить цифру x к числу d в указанной системе счисления base
: CIPHER ( d x base --> d ) >L U>D DSWAP L> DU* D+ ;

\ перевести символьное представление числа во внутреннее по указанной base √
\ преобразование ведется до конца строки или до первого непреобразуемого
\ символа. Если asc # на выходе имеет нулевую длину, число опознано.
: >number ( ud asc # base --> ud asc # )
>R BEGIN *WHILE \ пока не конец строки
OVER C@ R@ DIGIT WHILE \ до первой непреобразуемой цифры
-ROT SKIP1 D>L R@ CIPHER DL> \ добавить цифру
REPEAT
THEN RDROP ;
</pre>

Автор:  mOleg [ Пн мар 01, 2010 13:37 ]
Заголовок сообщения: 

Хищник писал(а):
Вообще говоря, преобразование числа легко может быть оформлено в виде примитива, где будут использоваться ровно те команды, которые требуются и удобны.

и тут я абсолютно согласен. Из примеров в том же SMAL32 так было сделано (>VAL, кажется, называлось).
только для этого самого слова должен быть определен интерфейс, т.е. что на входе и что на выходе, а варианты есть:
1) стандартный ( ud asc # --> ud1 asc # )
2) упрощенный ( asc # --> u )
3) без использования переменной BASE ( asc # base --> u )
так же возможны вариации с тем, будет ли слово ловить ошибки или нет.

Автор:  Hishnik [ Пн мар 01, 2010 14:51 ]
Заголовок сообщения: 

mOleg писал(а):
: DIGIT ( char base --> u TRUE | FALSE )

Ну а тут что в стековой нотации? От того, что значение BASE отдано какому-то внешнему коду, необходимость ее хранения не пропадает. А значит, основание системы счисления все равно будет где-то храниться. И кто отгадает, какое имя скорее всего будет присвоено этой переменной? :)

Автор:  вопрос [ Пн мар 01, 2010 15:02 ]
Заголовок сообщения: 

Хищник писал(а):
mOleg писал(а):
: DIGIT ( char base --> u TRUE | FALSE )

Ну а тут что в стековой нотации? От того, что значение BASE отдано какому-то внешнему коду, необходимость ее хранения не пропадает. А значит, основание системы счисления все равно будет где-то храниться. И кто отгадает, какое имя скорее всего будет присвоено этой переменной? :)
numeration-base :D

Страница 1 из 9 Часовой пояс: UTC + 3 часа [ Летнее время ]
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
http://www.phpbb.com/