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-еры лучше всех знают, как надо... :dmad;

Автор:  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/