5

一个简单的问题,结果却很复杂:

如何在 GForth 中将浮点数转换为字符串?所需的行为如下所示:

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

2 回答 2

5

经过大量挖掘,我的一位同事发现了它:

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

在 c-addr nr 处将 rf 转换为字符串。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。

用人类可读的术语来说,这些函数需要浮点堆栈上的一个数字和数据堆栈上的三个数字。

第一个数字参数告诉它字符串应该有多长,第二个参数告诉它你想要多少小数,第三个告诉它最小小数位数(大致转换为精度)。执行大量隐式数学以确定生成的最终字符串格式,因此几乎需要进行一些修补才能使其按照您想要的方式运行。

对其进行测试(我们不想重新构建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
于 2018-12-06T12:43:34.207 回答
3

我找不到确切的词,所以我查看了 Gforth 资源。

显然,您可以使用represent将最重要的数字打印到提供的缓冲区中的单词,但这并不完全是最终输出。represent返回有效性和符号标志,以及小数点的位置。然后,该词用于浮点打印词 ( f., fp. fe.) 的所有变体中。

可能最简单的方法是emit用您的单词替换(emit是一个延迟单词),将数据保存在您需要的位置,使用可用的浮动品脱打印单词之一,然后恢复emit为原始值。

我也想听听首选的解决方案...

于 2018-12-06T06:56:54.260 回答