Forth http://fforum.winglion.ru/ |
|
lib/include/float2.f и 12.34d http://fforum.winglion.ru/viewtopic.php?f=18&t=1072 |
Страница 1 из 2 |
Автор: | ygrek [ Чт дек 13, 2007 12:43 ] |
Заголовок сообщения: | lib/include/float2.f и 12.34d |
Библиотека lib/include/float2.f воспринимает вещественные числа как в формате 12.34e, так и 12.34d (эти записи эквивалентны). Данный опрос ставит целью выяснить уровень использования второй записи (и в случае нулевого результата эта возможность скорее всего будет удалена). "Использовать X" следует понимать как "писать/запускать иногда программы использующие X" (т.е. более одного раза). PS Если вы выбрали вариант ответа кроме первого, но тем не менее считаете что числа вида 12.34d нужны - аргументируйте пожалуйста в треде. |
Автор: | Ilya [ Чт дек 13, 2007 12:56 ] |
Заголовок сообщения: | |
В некоторых своих поделках использовал флоаты и лично мне привычней запись с "е"! |
Автор: | Hishnik [ Пт дек 14, 2007 01:16 ] |
Заголовок сообщения: | |
Еще бы e убрать из обязательных символов, а ориентироваться исключительно на точку. |
Автор: | mOleg [ Пт дек 14, 2007 11:32 ] |
Заголовок сообщения: | |
Хищник писал(а): Еще бы e убрать из обязательных символов, а ориентироваться исключительно на точку.
плохо оно. точка - это число двойной длинны. есть идея веселее - в переменной BASE выдумать состояние для float ... ну а если серьезно, то я вижу три варианта: использовать запятую вместо точки: 1,23423 - это folat 1.23423 - это double использовать контекст( можно в форке) то есть числа с плавающей точкой, распознаваться будут, когда словарь, работающий с float в контексте, и находится ближе словаря NUMBERS. оставить как есть - самый простой и совместимый вариант. |
Автор: | WingLion [ Пт дек 14, 2007 11:51 ] |
Заголовок сообщения: | |
mOleg писал(а): есть идея веселее - в переменной BASE выдумать состояние для float ...
А чего его выдумывать? есть же 0, который в BASE приводит к исключениям... Его и можно задействовать |
Автор: | Hishnik [ Пт дек 14, 2007 22:58 ] |
Заголовок сообщения: | |
mOleg писал(а): плохо оно. точка - это число двойной длинны. Ну да, кто-то хорошо пофантазировал. Чем плоха запись 1234:5678, широко применявшаяся для задания пары чисел "сегмент-смещение"? mOleg писал(а): использовать запятую вместо точки: 1,23423 - это folat 1.23423 - это double
Оба - comp (внутренний формат сопроцессора). Формат появляется в процессе сохранения в память, команды для этого разные. |
Автор: | ygrek [ Сб дек 15, 2007 00:54 ] |
Заголовок сообщения: | |
Хищник писал(а): Еще бы e убрать из обязательных символов, а ориентироваться исключительно на точку. Ну это могут себе позволить только форты не претендующие на ANS-совместимость. mOleg писал(а): использовать запятую вместо точки: 1,23423 - это folat 1.23423 - это double А какое различие между single'ами и double'ами раз они все строем идут на флоат-стек? Экономить байты в области данных за счёт увеличения нагрузки на программера? mOleg писал(а): сть идея веселее - в переменной BASE выдумать состояние для float ...
Ага, замечательно весёлая идея, с точки зрения читабельности кода. |
Автор: | Hishnik [ Сб дек 15, 2007 01:38 ] |
Заголовок сообщения: | |
ygrek писал(а): Ну это могут себе позволить только форты не претендующие на ANS-совместимость.
Это безобразие давно пора по факту приводить в норму! Хотя бы разрешать использование чисел только с точкой. Куда ни посмотришь, точки достаточно, одни ANS-еры лучше всех знают, как надо... |
Автор: | mOleg [ Сб дек 15, 2007 22:14 ] |
Заголовок сообщения: | |
ygrek писал(а): mOleg писал(а):использовать запятую вместо точки: 1,23423 - это folat 1.23423 - это double
А какое различие между single'ами и double'ами раз они все строем идут на флоат-стек? не верно. Число с точкой внутри идет на data стек, только занимает две ячейки. В спф этот момент иногда используется в виде 0.0 но к сожалению в СПФе такие числа преобразуются с ошибкой 8( правда я у себя уже исправил. Точка по-моему таки не очень подходит. А вот с запятой идея по-моему хорошая |
Автор: | Hishnik [ Сб дек 15, 2007 22:43 ] |
Заголовок сообщения: | |
mOleg писал(а): Точка по-моему таки не очень подходит.
А вот с запятой идея по-моему хорошая Вот так - в корне неверно. Есть стандарт на запись чисел - не фортовский, а математический. И если некий язык программирования вводит свой формат, значит, он или сильно специализирован и предназначен для узкой области (математической), либо... это разновидность выпендрежа. Ну в крайнем случае дремучего невежества и отсталости авторов стандарта/транслятора, не следящих за текущими реалиями. В конце концов, есть символ-разделитель Windows (точка или запятая в зависимости от системных настроек). Это тоже вариант. В подавляющем большинстве (практически поголовно) языков признак вещественного числа - точка. 0.0 - это вариант записи сопроцессорной константы "вещественный ноль", который преобразуется в fldz. Собственно, отношение с записи вещественного числа весьма и весьма показательно. Эта шелуха с эксклюзивным форматом слетает, как только Форт начинает интенсивно использоваться для обработки текстовых данных, сформированных другими программами... то есть вообще включается в реальные проекты. И могу уверить, что просьбы "сохраняйте мне с символом E, потому что иначе я не обработаю" ну никак не приводят в этом случае ни к повышению эффективности процесса, ни к улучшению репутации Форта как удобного инструмента. |
Автор: | ygrek [ Вс дек 16, 2007 00:09 ] |
Заголовок сообщения: | |
Хищник писал(а): Собственно, отношение с записи вещественного числа весьма и весьма показательно. Эта шелуха с эксклюзивным форматом слетает, как только Форт начинает интенсивно использоваться для обработки текстовых данных, сформированных другими программами... то есть вообще включается в реальные проекты. И могу уверить, что просьбы "сохраняйте мне с символом E, потому что иначе я не обработаю" ну никак не приводят в этом случае ни к повышению эффективности процесса, ни к улучшению репутации Форта как удобного инструмента.
Чьё отношение-то? В "реальном" проекте просто напросто пишется свой преобразователь для флоатов и никаких проблем. Т.е. если вы обрабатывает сторонние данные то вряд-ли получится просто за-EVALUATE'ить весь входной файл и поэтому каждое число явно парсится - тогда какая разница что вызывать - >FLOAT или >MY-FLOAT ? Естественно вопрос в том как разбирать float'ы по умолчанию. Но как я уже сказал выше - тут ответ простой - либо ANS и точка для двойных чисел и e для вещественных, либо не-ANS со всеми вытекающими плюшками. |
Автор: | Hishnik [ Вс дек 16, 2007 00:18 ] |
Заголовок сообщения: | |
ygrek писал(а): Чьё отношение-то? В "реальном" проекте просто напросто пишется свой преобразователь для флоатов и никаких проблем. Т.е. если вы обрабатывает сторонние данные то вряд-ли получится просто за-EVALUATE'ить весь входной файл и поэтому каждое число явно парсится - тогда какая разница что вызывать - >FLOAT или >MY-FLOAT ?
Получится. Если слово попадает в NUMBER, можно вызывать после него диспетчер, который будет сам передвигать указатель и заполнять массив. Можно принимать текстовые файлы сразу в массив. Вопрос в следующем - либо мы ориентируемся на процесс с минимумом подводных камней, либо на умозрительные стандарты. |
Автор: | ygrek [ Вс дек 16, 2007 13:39 ] |
Заголовок сообщения: | |
Хищник писал(а): Получится. Если слово попадает в NUMBER, можно вызывать после него диспетчер, который будет сам передвигать указатель и заполнять массив. Как именно оно попадает в NUMBER и что это за NUMBER? Покажите код(псевдокод)? Например. Есть файл : Код: 1.23 4.56 7.89 2.34 5.67 8.90 ... Как вы его будете EVALUATE'ить? Как его представить в виде форт-исходника чтобы он "сам себя" прочитал? Всякие callback'и (например "после_каждого_числа" или "после_каждой_строки") делаются неочевидным образом (курочить INTERPRET ради такой простой задачи не хочется). И получается что проще/логичнее делать как-то так Код: S" filename" LAMBDA{ 3 0 DO PARSE-NAME >FLOAT IF СохранитьЧисло ELSE Ругаться THEN LOOP } INCLUDED-LINES-WITH Цитата: Можно принимать текстовые файлы сразу в массив. Как? Как при этом будет выглядеть обработка ошибок? Цитата: Вопрос в следующем - либо мы ориентируемся на процесс с минимумом подводных камней, либо на умозрительные стандарты.
Ну по факту стандарт совсем не умозрительный. А такой какой он есть. Другого нет. Увы. In a nutshell : Конечно проще определять вещественные числа по точке, но так как есть сейчас не создаёт прям-таки принципиальных трудностей при работе. |
Автор: | Hishnik [ Вс дек 16, 2007 15:50 ] |
Заголовок сообщения: | |
ygrek писал(а): Как вы его будете EVALUATE'ить? Как его представить в виде форт-исходника чтобы он "сам себя" прочитал? Всякие callback'и (например "после_каждого_числа" или "после_каждой_строки") делаются неочевидным образом (курочить INTERPRET ради такой простой задачи не хочется). Его не надо курочить. Ключевые слова должны быть векторизованы, чтобы можно было вносить небольшие по объему исправления. Если нет - имеем ситуацию, когда программист, желающий применить транслятор в новой области, вынужден просить авторов внести мелкие правки, которые не затрагивают движок, но корректируют поведение, как требует новое применение. А авторы еще подумают, сошлются на стандарт (Форта, а не области применения, где слыхом не слыхивали о том, что через точку пишется число двойной длины), расскажут, что Форт надо понимать... что теперь удивительного в недостаточно активном распространении? ygrek писал(а): Как? Как при этом будет выглядеть обработка ошибок?
Код: CREATE ARRAY[] 1000 FLOATS ALLOT
0 VALUE POINTER : INPUT ( F: x -- ) POINTER FLOATS ARRAY[] + F! POINTER 1+ TO POINTER ; ' INPUT TO DISPATCH-NUMBER Обработка ошибок: " 1.23456.345.EZZZ не найдено и не является числом". Опознает NUMBER. |
Автор: | ygrek [ Вс дек 16, 2007 18:36 ] |
Заголовок сообщения: | |
Что-то я не понимаю как это работает. А целые числа? Ещё один вектор? А двойные числа - ещё один? Что будет если флоаты идут вперемешку с целыми числами? |
Страница 1 из 2 | Часовой пояс: UTC + 3 часа [ Летнее время ] |
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group http://www.phpbb.com/ |