一个简单的问题却变得非常复杂:
如何在GForth中将浮点数转换为字符串?所需的行为如下所示:
1.2345e fToString \ takes 1.2345e from the float stack and pushes (addr n) onto the data stack
答案 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