GForth:将浮点数转换为String

nit*_*owa 5 forth gforth

一个简单的问题原来非常复杂:

如何在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)

nit*_*owa 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

将 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)