GForth:将浮点数转换为String

时间:2018-12-05 23:47:54

标签: forth gforth

一个简单的问题却变得非常复杂:

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

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

2 个答案:

答案 0 :(得分:3)

我找不到确切的词,所以我调查了Gforth消息源。

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

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

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

答案 1 :(得分:3)

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

  

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

     

打印float rf格式。输出的总宽度为nr。对于   定点表示法,小数点后的位数为   + nd,有效数字的最小数目为np。设置精度对f.rdp没有影响。如果定点符号为   siginicant位数至少为np,并且位数   小数点将适合之前。如果不是定点表示法   使用指数表示法,如果不合适,   星号被打印。我们建议使用nr> = 7以避免发生   数字根本不合适。我们建议nr> = np + 5以避免出现以下情况:   f.rdp切换到指数表示法,因为定点表示法   有效位数太少,但指数表示法提供   较少的有效数字。如果您想拥有nr> = nd + 2,我们建议   一些数字的定点表示法。如果需要,我们建议np> nr   对所有数字都采用指数表示法。

用易于理解的术语,这些函数在浮点堆栈上需要一个数字,在数据堆栈上需要三个数字。

第一个数字参数告诉它字符串应该多长,第二个参数告诉你多少个小数位,第三个告诉它最小的小数位数(大致可转换为精度)。为了确定最终生成的String格式,将执行大量的隐式数学运算,因此几乎需要进行一些修补才能使其表现出所需的效果。

对其进行测试(我们不想重建f.,而是产生一种格式,该格式将被再次EVALUATE再次接受为浮点数,因此{{1 }}符号是故意的):

1.2345E0