一个简单的问题,结果却很复杂:
如何在 GForth 中将浮点数转换为字符串?所需的行为如下所示:
1.2345e fToString \ takes 1.2345e from the float stack and pushes (addr n) onto the data stack
经过大量挖掘,我的一位同事发现了它:
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
我找不到确切的词,所以我查看了 Gforth 资源。
显然,您可以使用represent
将最重要的数字打印到提供的缓冲区中的单词,但这并不完全是最终输出。represent
返回有效性和符号标志,以及小数点的位置。然后,该词用于浮点打印词 ( f.
, fp.
fe.
) 的所有变体中。
可能最简单的方法是emit
用您的单词替换(emit
是一个延迟单词),将数据保存在您需要的位置,使用可用的浮动品脱打印单词之一,然后恢复emit
为原始值。
我也想听听首选的解决方案...