一个简单的问题原来非常复杂:
如何在GForth中将浮点数转换为字符串?所需的行为如下所示:
1.2345e fToString \ takes 1.2345e from the float stack and pushes (addr n) onto the data stack
Run Code Online (Sandbox Code Playgroud)
经过一番挖掘,我的一位同事发现了它:
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,如果您想对所有数字使用指数表示法。
用人类可读的术语来说,这些函数需要浮点堆栈上的一个数字和数据堆栈上的三个数字。
第一个数字参数告诉它字符串应该有多长,第二个告诉它你想要多少小数,第三个告诉它最小的小数位数(大致转换为精度)。执行大量隐式数学运算以确定生成的最终 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
Run Code Online (Sandbox Code Playgroud)