Forth
http://www.fforum.winglion.ru/

представление чисел
http://www.fforum.winglion.ru/viewtopic.php?f=25&t=2221
Страница 5 из 5

Автор:  _Harry [ Пн авг 10, 2009 10:52 ]
Заголовок сообщения: 

mOleg писал(а):
В данной Форт-системе есть ряд отличий и в том, как распознаются числа, и в том, какой формат записи чисел принят (по сравнению с ANSI94).


Несовсем понятно что получится если введена строка определяющая число больше чем двойное.
А также мне кажется ' это уже слишком,
: достаточно.

Автор:  mOleg [ Пн авг 10, 2009 17:11 ]
Заголовок сообщения: 

вопрос писал(а):
Забыл спросить, чему в реальности соответствуют отрицательные шестнадцатеричные числа

:) вопрос логичный. Но иногда проще записать: -0x2 а не 0xFFFFFFE
вобщем дополнительный код
кстати, замечу, что запись -0x2 гораздо универсальнее, чем 0xFF... потому, что не завязана на разрядность числа

Автор:  mOleg [ Пн авг 10, 2009 17:15 ]
Заголовок сообщения: 

_Harry писал(а):
Несовсем понятно что получится если введена строка определяющая число больше чем двойное.

Источник: D:\fork\src-102\lib\util\envir.fts           
В строке: 35 :52
: MAX-UD ( --> dconst ) 0xFFFFFFFFFFFFFFFF
Число двойной длины!

вот так выглядит предупреждение :)

_Harry писал(а):
А также мне кажется ' это уже слишком, : достаточно.

они разные, если ты наберешь в строке:
123:456 то на стеке получишь два числа: 456 123
123`456 на стеке оставит два числа: 0 123456

однако, самое интересное происходит с отрицательными числами:
-123:456 = -456 -124
-123`456 = -1 -123456

Автор:  _Harry [ Вт авг 11, 2009 17:45 ]
Заголовок сообщения: 

mOleg писал(а):
Источник: D:\fork\src-102\lib\util\envir.fts

В строке: 35 :52

: MAX-UD ( --> dconst ) 0xFFFFFFFFFFFFFFFF

Число двойной длины!



вот так выглядит предупреждение

Это когда число двойной длины тут понятно.
А когда еще длиннее надо бы предупредить или выдать ошибку.?

Автор:  mOleg [ Вт авг 11, 2009 21:27 ]
Заголовок сообщения: 

_Harry писал(а):
А когда еще длиннее надо бы предупредить или выдать ошибку.

а вот это сложно ловить. Я подумаю как сделать проще, но переполнение двойной разрядност ловить сложнее.

Автор:  Wlad [ Вт авг 11, 2009 23:02 ]
Заголовок сообщения: 

Очередные мои пять копеек:

Зачем явно указывать для чисел двойной длины какая часть числа в какой элемент стека пойдёт???

Я согласен: конечно, в Форте особенности вычислительного механизма (стек) ЯВНО присутствуют в языке.
НО! В подавляющем большинстве случаев прикладных программ программист абстрагируется от представления чисел в вычислительном механизме.
Знание распределение (количества) байтов по элементам стека может быть полезным, но мы можем попасть в просак при переносе фортовых исходников с платформы на платформу.

есть число 0х123456 - все прекрасно понимают, что это за число
как только вы устанавливаете правило какая часть байтов в какой элементов стека уходит, то при смене разрядности у вас это будет уже ДРУГОЕ число ( в середину числа внесены доп элементы - нулевые байты). А большинство алгоритмов работают с ЯЧЕЙКАМИ. И если двойное число это ДВЕ ячейки, то, при упомянутом мною случае, вы автоматом получаете ошибки и головняк.

Автор:  mOleg [ Ср авг 12, 2009 20:12 ]
Заголовок сообщения: 

Wlad писал(а):
Зачем явно указывать для чисел двойной длины какая часть числа в какой элемент стека пойдёт???

это вообще-то определяется используемой архитектурой процессора BIG vs LITTLE endian

Wlad писал(а):
НО! В подавляющем большинстве случаев прикладных программ программист абстрагируется от представления чисел в вычислительном механизме.

я не акцентировал то, как хранятся числа в памяти. Я просто показал, в чем отличе в записи: 123`123 и 123:123
если есть идея, как это сделать без показывания как оно в памяти будет лежать, то говори 8) я исправлю(сь)

Wlad писал(а):
как только вы устанавливаете правило какая часть байтов в какой элементов стека уходит, то при смене разрядности у вас это будет уже ДРУГОЕ число ( в середину числа внесены доп элементы - нулевые байты). А большинство алгоритмов работают с ЯЧЕЙКАМИ. И если двойное число это ДВЕ ячейки, то, при упомянутом мною случае, вы автоматом получаете ошибки и головняк.

эм, не совсем так. Собственно две ячейки и есть две ячейки.

Автор:  Majestio [ Вт май 28, 2013 11:39 ]
Заголовок сообщения:  Re:

mOleg писал(а):
то есть предлагаете формат записи чисел двойной длины:
1231:3423 ?
тогда если просто число типа; 1234313478 не влазит в CELL, то ошибку выдавать?
я правильно понял?

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

Конечная программа может (должна) работать на процессорах различной разрядности. Я считаю, что имеет смысл разделить вычисления на "родные" и "зарубежные" (читаем "за рубежом"). Буквально это должно означать следующее:

1) Компилируется/интерпретируется код, он изначально знает о своей разрядности целевой платформы
2) Создается некая библиотека - в заголовка/настройках программист обязан указать желаемую разрядность
3) "Линкер" обязан подключить одну из библиотек - "родной" разрядности или "повышенной" в зависимости от двух факторов - спецификация разрядности в коде, анализ неопределенной разрядности в процессе разбора исходного кода

Примеры:

работаем с числом xEF0D

  • Для 8-битного процессора это число "не родное", нужно использование библиотеки "повышенной разрядности";
  • Для 16-,32-,64-битного - оно вмещается в "битность" - используем "родную" библиотеку;

Есть ряд задач, где необходимо манипулировать сверх-большими числами. Порядка n*10^100. Как поступить? ИМХО - это адекватно ложится в мою концепцию "родное/не родное" вычисление.

Резюме: релиз библиотеки предусматривает обязательное уточнение целевой таргет-разрядности. Для гибкости можно предусмотреть "библиотечный" и "словарный" описатель (если слово оперирует другой, отличной разрядностью) .

Автор:  mOleg [ Ср май 29, 2013 10:53 ]
Заголовок сообщения:  Re: представление чисел

Majestio писал(а):
Конечная программа может (должна) работать на процессорах различной разрядности. Я считаю, что имеет смысл разделить вычисления на "родные" и "зарубежные" (читаем "за рубежом").

в Форте обычно так:
Есть базовая разрядность, с которой работает ФВМ (обычно, но не всегда, соответствует разрядности АЛУ процессора); все операции без префиксов работают с числами данной разрядности; если появляется новый тип данных, появляются операции с префиксами, т.е.:
@ ! - это работа со значениям базовой разрядности;
2@ 2! (или D@ D!) - работа со значениями двойной длины;
F@ F! - работа с числами в формате с плавающей точкой,
и т.д.
Такой формат вобщем достаточно универсален, но, при портировании кода на другие системы с другой разрядностью возможны проблемы, но аналогичные проблемы у того же Си с типом int.
Возможно, стоит забить на CELL (то есть ячейку базовой разрядности) и явно указывать для каждой операции разрядность операндов, т.е., к примеру, убрать @ и ! заменив их на Q@ Q! (вобщем префикс ввести обязательный). Последнее будет нормально работать для чисел базовой разрядности и ниже, а вот с числами, не влезающими в CELL проблема не уйдет.

Автор:  gudleifr [ Ср май 29, 2013 11:19 ]
Заголовок сообщения:  Re: представление чисел

В простейшей Forth-реализации львиная доля чисел требуется на обслуживание адресной арифметики и естественным является стек, содержащий вперемешку числа и адреса (понятно, одинаковой длины).
Если требуется работа с "другими" числами, то, за исключением популярных трюков с двойными числами, проще создать отдельный стек.
Если же шитый код сам требует "странных" чисел, например, упакованных, то имеет смысл сразу отказаться от "обычного" способа построения Forth системы, разделив "логическую" и "физическую" организацию компилируемого кода. (Т.е. Forth будет думать, что работает с обычными числами/адресами или, даже, методами/сообщениями, а слова работы со словарем будут переводить их в требуемый вид - относительный, упакованный или еще какой).

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