GForth: конвертировать число с плавающей точкой в ​​строку - PullRequest
0 голосов
/ 06 декабря 2018

Простой вопрос, который оказался довольно сложным:

Как мне превратить float в String в GForth?Желаемое поведение будет выглядеть примерно так:

1.2345e fToString \ takes 1.2345e from the float stack and pushes (addr n) onto the data stack

Ответы [ 2 ]

0 голосов
/ 06 декабря 2018

После долгих поисков один из моих коллег нашел его:

f> str-rdp (rf + nr + nd + np - c-addr nr)

https://www.complang.tuwien.ac.at/forth/gforth/Docs-html-history/0.6.2/Formatted-numeric-output.html

Конвертировать rf в строку в c-addr nr.Правила преобразования и значения nr + nd np такие же, как и для f.rdp.

И из f.rdp:

f.rdp (rf +nr + nd + np -)

https://www.complang.tuwien.ac.at/forth/gforth/Docs-html/Simple-numeric-output.html

Печать с плавающей запятой в формате rf.Общая ширина вывода равна nr.Для записи с фиксированной запятой число цифр после десятичной запятой равно + nd, а минимальное количество значащих цифр равно np.Точность установки не влияет на f.rdp.Обозначение с фиксированной запятой используется, если число знаковых цифр будет не менее np и если число цифр перед десятичной запятой будет соответствовать.Если нотация с фиксированной точкой не используется, используется экспоненциальная нотация, а если она не подходит, печатаются звездочки.Мы рекомендуем использовать nr> = 7, чтобы избежать риска того, что числа не будут соответствовать.Мы рекомендуем nr> = np + 5, чтобы избежать случаев, когда f.rdp переключается на экспоненциальную запись, потому что запись с фиксированной точкой будет иметь слишком мало значащих цифр, а экспоненциальная запись предлагает меньше значащих цифр.Мы рекомендуем nr> = nd + 2, если вы хотите иметь фиксированную запись для некоторых чисел.Мы рекомендуем np> nr, если вы хотите иметь экспоненциальную запись для всех чисел.

В понятных человеку терминах эти функции требуют числа в стеке float и трех чисел в стеке данных.

Первый числовой параметр сообщает ему как долго должна быть строка, второй сколько десятичных знаков вы хотели бы, а третий сообщает ему минимум количество десятичных знаков (что примерно соответствует точности).Большая часть неявной математики выполняется для определения окончательного формата String, который создается, поэтому для того, чтобы заставить его вести себя так, как вам нужно, почти требуется некоторая обработка.

Тестирование (мы не хотим перестраивать f., но для создания формата, который будет приниматься как число с плавающей запятой с четвертым до EVALUATE его снова, так что запись 1.2345E0 специально предназначена):

PI 18 17 17 f>str-rdp type \ 3.14159265358979E0 ok
PI 18 17 17 f.rdp          \ 3.14159265358979E0 ok
PI f.                      \ 3.14159265358979  ok
0 голосов
/ 06 декабря 2018

Я не смог найти точное слово для этого, поэтому я искал источники Gforth.

Очевидно, вы могли бы пойти с represent словом, которое печатает наиболее значимые числа в предоставленный буфер, но это не такточно окончательный вывод.represent возвращает флажки достоверности и подписи, а также положение десятичной точки.Это слово затем используется во всех вариантах печатных слов с плавающей запятой (f., fp. fe.).

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

Я также хотел бы услышать предпочтительное решение...

...