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 вот так выглядит предупреждение _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 если есть идея, как это сделать без показывания как оно в памяти будет лежать, то говори я исправлю(сь) Wlad писал(а): как только вы устанавливаете правило какая часть байтов в какой элементов стека уходит, то при смене разрядности у вас это будет уже ДРУГОЕ число ( в середину числа внесены доп элементы - нулевые байты). А большинство алгоритмов работают с ЯЧЕЙКАМИ. И если двойное число это ДВЕ ячейки, то, при упомянутом мною случае, вы автоматом получаете ошибки и головняк.
эм, не совсем так. Собственно две ячейки и есть две ячейки. |
Автор: | Majestio [ Вт май 28, 2013 11:39 ] |
Заголовок сообщения: | Re: |
mOleg писал(а): то есть предлагаете формат записи чисел двойной длины: 1231:3423 ? тогда если просто число типа; 1234313478 не влазит в CELL, то ошибку выдавать? я правильно понял? Сорри за некропостинг. Посчитал данную тему для себя крайне важной, хочется высказаться. Скорее пост себе - в качестве размышления. Конечная программа может (должна) работать на процессорах различной разрядности. Я считаю, что имеет смысл разделить вычисления на "родные" и "зарубежные" (читаем "за рубежом"). Буквально это должно означать следующее: 1) Компилируется/интерпретируется код, он изначально знает о своей разрядности целевой платформы 2) Создается некая библиотека - в заголовка/настройках программист обязан указать желаемую разрядность 3) "Линкер" обязан подключить одну из библиотек - "родной" разрядности или "повышенной" в зависимости от двух факторов - спецификация разрядности в коде, анализ неопределенной разрядности в процессе разбора исходного кода Примеры: работаем с числом xEF0D
Есть ряд задач, где необходимо манипулировать сверх-большими числами. Порядка 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/ |