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 отдано какому-то внешнему коду, необходимость ее хранения не пропадает. А значит, основание системы счисления все равно будет где-то храниться. И кто отгадает, какое имя скорее всего будет присвоено этой переменной? |
Страница 1 из 9 | Часовой пояс: UTC + 3 часа [ Летнее время ] |
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group http://www.phpbb.com/ |